BZOJ 1003 ZJOI2006 物流运输trans 动态规划+SPFA
2015-10-26 19:25
423 查看
标题效果:给定一个无向图。输送n日,有一天的某一时刻不能去,更换行考虑k,求总成本
一阶cost[i][j]用于第一i为了天j天正在同一航线的最低消费 这种利用SPFA处理
然后就是移动的法规问题 订购f[i]至1~i最低消费天
然后,f[i]=min{ f[j]+cost[j+1][i]+k } ( 0<=j<i )
注意m和n别写反
乘天数之前要特判是不是正无穷
一阶cost[i][j]用于第一i为了天j天正在同一航线的最低消费 这种利用SPFA处理
然后就是移动的法规问题 订购f[i]至1~i最低消费天
然后,f[i]=min{ f[j]+cost[j+1][i]+k } ( 0<=j<i )
注意m和n别写反
乘天数之前要特判是不是正无穷
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct abcd{ int to,f,next; }table[10000]; int head[30],tot; int n,m,_k,e,d,cost[110][110]; bool ban[30][110],unusable[30]; int q[65540],f[110],v[30]; unsigned r,h; void SPFA() { int i; memset(f,0x3f,sizeof f); q[++r]=1;f[1]=0; while(r!=h) { int x=q[++h]; v[x]=0; for(i=head[x];i;i=table[i].next) if(!unusable[table[i].to]) if(f[x]+table[i].f<f[table[i].to]) { f[table[i].to]=f[x]+table[i].f; if(!v[table[i].to]) v[table[i].to]=1,q[++r]=table[i].to; } } } void Add(int x,int y,int z) { table[++tot].to=y; table[tot].f=z; table[tot].next=head[x]; head[x]=tot; } int main() { int i,j,k,x,y,z; cin>>n>>m>>_k>>e; for(i=1;i<=e;i++) { scanf("%d%d%d",&x,&y,&z); Add(x,y,z); Add(y,x,z); } cin>>d; for(i=1;i<=d;i++) { scanf("%d%d%d",&z,&x,&y); for(j=x;j<=y;j++) ban[z][j]=1; } for(i=1;i<=n;i++) for(j=i;j<=n;j++) { memset(unusable,0,sizeof unusable); for(x=2;x<m;x++) for(k=i;k<=j;k++) if(ban[x][k]) { unusable[x]=1; break; } SPFA(); cost[i][j]=f[m]*(f[m]>=0x3f3f3f3f? 1:j-i+1); } memset(f,0x3f,sizeof f); f[0]=0; for(i=1;i<=n;i++) for(j=0;j<i;j++) f[i]=min(f[i],f[j]+cost[j+1][i]+_k); cout<<f -_k<<endl; }
相关文章推荐
- Codeforces Round #327 (Div. 2)——B. Rebranding
- iphone数据存储之-- Core Data的使用(一)
- codeforces#327-C.Median Smoothing-规律题
- 有关802.11协议
- C++,JAVA之间相互调用学习
- #在蓝懿学习iOS的日子#Day5
- 记使用linux命令行编译c语言步骤
- 局部变量和成员变量的区别
- bfprt算法----找出数组中最小的k个数(Java)
- http状态码详解
- python property
- shell条件判断小知识
- poj 3080(后缀数组)
- document.createElement()的用法
- XVWA黑客靶场发布
- 数据结构_不带头结点的链表逆制
- DownFile
- C# 关键字
- C++:类的组合
- 第六周数据结构实践——后缀表达式(栈)【项目5 - 后缀表达式】