#2826. 物流运输(trans)
题目描述
物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。
输入格式
文件trans.in的第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。
再接下来一行是一个整数d,后面的d行每行是三个整数P(1<P<m)、a、b(1<=a<=b<=n)。表示编号为P的码头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头A到码头B的运输路线。
保证数据有梯度。
输出格式
文件trans.out包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。
数据范围与提示
【样例说明】
前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)3+(3+2)2+10=32
下图依次表示第一至五天的情况。红色表示不可用的码头
来源
noip2016 南外模拟2
题解:
首先,找出所有最短路径,和当前最短路径的点的状态(二进制状压)。
可知,在某个点集中只有删掉最短路的点,才能构造出新的路径,所以可以dfs来跑。
最后再dp即可。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#define N 105
#define M 22
using namespace std;
const int inf=1061109567;
int ro[1000006],top,n,m,e,head[M],nex[M*M<<1],tot,ver[M*M<<1];
long long k,edge[M*M<<1];
long long f[3][1000006],fi_dis[1000005];
inline void add(int x,int y,long long z){nex[++tot]=head[x];head[x]=tot;ver[tot]=y;edge[tot]=z;
}
inline int lowbit(int x){return x&(-x);}
priority_queue<pair<long long, int> > q;
int v[M];long long d[M];int sta;
int dij_dfs(int x){sta|=(1<<(x-1));if(x==1)return 0;int cnt=0,flag=0;for(int i=head[x];i;i=nex[i]){if(d[ver[i]]==d[x]-edge[i]){cnt++;flag|=dij_dfs(ver[i]);}}if(cnt>1)return 1;else return flag;
}
int dijstra(int s){while(!q.empty())q.pop();memset(v,0,sizeof(v));memset(d,0x3f,sizeof(d));d[1]=0;q.push(make_pair(0,1));while(!q.empty()){int x=q.top().second;q.pop();if(v[x])continue;for(int i=head[x];i;i=nex[i]){if((s>>(ver[i]-1))&1)continue;if(d[ver[i]]>d[x]+edge[i]){d[ver[i]]=d[x]+edge[i];q.push(make_pair(-d[ver[i]],ver[i]));}}}sta=0;if(dij_dfs(m))return -1;return d[m];
}
int vis[1000006];
void dfs(int s){if(s==(1<<m)-1)return ;if(vis[s])return ;int now=dijstra(s);vis[s]=1;if(now==inf)return ;if(now!=-1){ro[++top]=sta;fi_dis[top]=now;}int now_sta=sta;for(;now_sta;now_sta-=lowbit(now_sta)){if(lowbit(now_sta)!=1&&lowbit(now_sta)!=(1<<(m-1)))dfs(s|lowbit(now_sta));}
}
int nway[M][N];int main()
{scanf("%d%d%d%d",&n,&m,&k,&e);for(int i=1;i<=e;++i){int x,y;long long z;scanf("%d%d%lld",&x,&y,&z);add(x,y,z);add(y,x,z);}dfs(0);int Q;scanf("%d",&Q);for(int i=1;i<=Q;++i){int P,a,b;scanf("%d%d%d",&P,&a,&b);for(int j=a;j<=b;++j)nway[P][j]=1;}memset(f,0x3f,sizeof(f));f[0][0]=0;long long minn=0,ans=inf;int pre_sta=0;for(int i=1;i<=n;++i){pre_sta=sta;sta=0;for(int j=1;j<=m;++j){sta|=(nway[j][i]<<(j-1));}for(int j=1;j<=top;++j){if((sta|(~ro[j]))==(~ro[j])){if((pre_sta|(~ro[j]))==(~ro[j]))f[i&1][j]=min(minn,f[(i-1)&1][j])+fi_dis[j];else f[i&1][j]=minn+fi_dis[j];}if(i==n)ans=min(ans,f[i&1][j]);}minn=inf;for(int j=1;j<=top;++j){f[(i-1)&1][j]=inf;if(sta|(~ro[j])==(~ro[j])){minn=min(minn,f[(i)&1][j]+k);}}}printf("%d\n",ans);return 0;
}
/*
5 5 10 8
1 3 3
1 2 1
1 4 2
2 3 2
2 4 4
3 4 1
3 5 2
4 5 2
4
3 1 1
2 2 3
3 3 3
4 4 532
*/
#2826. 物流运输(trans)相关推荐
- BZOJ 1003: [ZJOI2006]物流运输trans
二次联通门 : BZOJ 1003: [ZJOI2006]物流运输trans /*BZOJ 1003: [ZJOI2006]物流运输transSpfa + DpSpfa预处理出i到j天的最小花费然后N ...
- [bzoj1003]物流运输trans
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3922 Solved: 1624 [Submi ...
- 【BZOJ】1003: [ZJOI2006]物流运输trans(SPFA+DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1003 这题一开始看是不会的额,,,还是看题解了..一开始我觉得不能用最短路啥的,,看了题解发现这是d ...
- BZOJ 1003 物流运输trans dijstra+dp
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1003 题意: 题解: 首先我们必须机智的知道f[i]=min(f[i],f[j]+cos ...
- 【bzoj1003】[ZJOI2006]物流运输trans 最短路+dp
非常容易的dp,一开始竟然还卡了一下. dp[i]表示到第i天的最小花费 dp[i]=min{dp[j]+cost[j+1][i]*(i-j)+k} (0<=j<i) cost[i][j] ...
- BZOJ1003: [ZJOI2006]物流运输trans(DP)
传送门 额,这道题拿到过后没有什么有建树的想法--甚至根本就没有往DP哪方面去向(还是题见少了,人太笨了--)所以就偷偷的看了一下discuss,看到了状态转移方程才恍然大悟. f(i)=f(j)+d ...
- 【BZOJ1003】【ZJOI2006】物流运输trans 最短路预处理+动态规划
链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...
- BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit ...
- 订单信息修改java模型图,java毕业设计_springboot框架的物流运输管理系统订单管理...
这是一个基于java的毕业设计项目,毕设课题为springboot框架的物流运输管理系统订单管理, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架js ...
最新文章
- Series([] , [‘索引‘]) 数据字典 {‘项值 ’:键值}
- 这家中国AI公司,正在打入新加坡AI“腹地”
- DIY烤肉加热台,了解一下?
- 力扣- -阶乘函数后K个零
- JavaFX中WebView的java与JS代码互相调用
- 2011 ICM 美国数据建模赛题
- MySQL workbench创建用户与授权
- 正在成为史上最全分类 Android 开源大全
- ENTBOOST V2014.183 Linux发布,开源企业IM免费企业即时通讯
- 使用Intellij Idea自定义MVC框架
- 发布 html win7 工具,win7 天气 Win7自带的桌面天气工具怎么使用
- 微信小程序 用户登录及对用户获取信息进行授权
- mysql最后一步装不上_mysql安装最后一步 安装不上
- 冰桶算法在监控软件中有哪些用途
- matlab给程序加总标题,【转】matlab标题,给figure加标题,subplot的部分用法
- 【哈夫曼树】创建哈夫曼树
- 国家队入场,中国数字资产交易市场或将迎来新一轮“洗牌”
- 使用Hydra通过ssh破解密码
- No servers available for service
- 基于Scratch的弹球游戏需求分析
热门文章
- Servlet-发送电子邮件
- 获明略科技B+轮战略投资,思迈特软件Smartbi用强产品思维推动BI生态完善
- QA质量体系搭建、质量架构全景图、质量效率全景图
- 2015-06-17
- 中考计算机试题ppt判断,2015中考信息技术试题PPT操作题2-26(终)
- 里奥机器人控制app_Cruzr(机器人控制软件)
- 【转】bit、Byte、bps、Bps、pps、Gbps的单位详细说明及换算
- CTF-SMB信息泄露【简单易懂】
- 微信支付服务商模式下的支付-特约商户-----亲试有效
- js 数字递增递减_JavaScript如何实现数字递增特效