bzoj1003: [ZJOI2006]物流运输(最短路+Dp)
2017-09-16 09:34
393 查看
题目传送门
首先这道题肯定有连续几天的航行是一样的。
那么我们不用去求出每天的方案。
只需求出每一段(连续的几天)的最短路然后*天数即可。
不难想到Dp。
用f[i]表示前i天的最小花费。
那么方程很容易就转化为:
f[i]=min(f[i],f[j]+spfa(j+1,i)+K);
方程表示的是前j天的最小花费+第(j+1)天到第i天用同一种方案的花费+修改一次方案的花费。
还是比较好理解的。
然后在spfa里面判断一下这几天这个码头能不能用即可。
代码实现:
大概就这样吧。
首先这道题肯定有连续几天的航行是一样的。
那么我们不用去求出每天的方案。
只需求出每一段(连续的几天)的最短路然后*天数即可。
不难想到Dp。
用f[i]表示前i天的最小花费。
那么方程很容易就转化为:
f[i]=min(f[i],f[j]+spfa(j+1,i)+K);
方程表示的是前j天的最小花费+第(j+1)天到第i天用同一种方案的花费+修改一次方案的花费。
还是比较好理解的。
然后在spfa里面判断一下这几天这个码头能不能用即可。
代码实现:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct node { int x,y,c,next; }a[11000];int len,last[31]; void ins(int x,int y,int c) { len++; a[len].x=x;a[len].y=y;a[len].c=c; a[len].next=last[x];last[x]=len; } int P[1100],s[1100],t[1100],d[31]; int st,ed,head,tail,list[1100],e,n,m; bool v[31],bo[31]; //bo数组表示的就是在这段时间里这个码头能不能用。能为true,不能为false int spfa(int ss,int tt) { //spfa表示的是从ss天到tt天的最小花费 memset(v,false,sizeof(v));v[st]=true; head=1;tail=2;list[1]=st; memset(d,63,sizeof(d));d[st]=0; memset(bo,true,sizeof(bo)); for(int i=1;i<=e;i++) //如果不能用的话把他弄为false if(!(t[i]<ss||s[i]>tt)) bo[P[i]]=false; while(head!=tail) { int x=list[head]; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(bo[y]==false) continue; //如果不能用的话就跳过这个点 if(d[y]>d[x]+a[k].c) { d[y]=d[x]+a[k].c; if(v[y]==false) { v[y]==true; list[tail++]=y; if(tail==ed+1) tail=1; } } } v[x]=false; head++; if(head==ed+1) head=1; } if(d[ed]>1000000000) return d[ed]; //如果无解的话就不用乘天数了我怕越过int但我又不想用long else return d[ed]*(tt-ss+1); //一种方案乘天数就是这段时间的最小花费。 } int f[110]; int main() { int K,tt; scanf("%d%d%d%d",&n,&m,&K,&tt); for(int i=1;i<=tt;i++) { int x,y,c;scanf("%d%d%d",&x,&y,&c); ins(x,y,c);ins(y,x,c); } st=1;ed=m; scanf("%d",&e); for(int i=1;i<=e;i++) scanf("%d%d%d",&P[i],&s[i],&t[i]); for(int i=1;i<=n;i++) { f[i]=spfa(1,i); //一开始的花费等于一次性就一种方案的最小花费 for(int j=1;j<i;j++) f[i]=min(f[i],f[j]+spfa(j+1,i)+K); //状态转移方程。 } printf("%d\n",f ); return 0; }
大概就这样吧。
相关文章推荐
- [BZOJ1003][ZJOI2006]物流运输(最短路+dp)
- [BZOJ1003]ZJOI2006 物流运输 |最短路|DP
- [bzoj1003][ZJOI2006][物流运输] (最短路+dp)
- [ZJOI2006]BZOJ 1003 物流运输 - 最短路 - dp
- [BZOJ1003][ZJOI2006]物流运输(最短路+dp)
- [bzoj 1003] [ZJOI2006]物流运输:最短路,DP
- bzoj 1003: [ZJOI2006]物流运输(最短路+DP)
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
- 【BZOJ1003】[ZJOI2006]物流运输trans【最短路】【DP】
- bzoj1003: [ZJOI2006]物流运输trans[最短路+DP]
- bzoj 1003 [ZJOI2006]物流运输trans 最短路+DP
- 【bzoj1003】【ZJOI2006】【物流运输】【dp+最短路】
- [BZOJ1003][ZJOI2006]物流运输(最短路+DP)
- BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)
- 【DP+最短路】BZOJ1003 [ZJOI2006]物流运输
- bzoj 1003 [ZJOI2006]物流运输(最短路spfa+dp)
- BZOJ 1003 [ZJOI2006]物流运输(最短路+dp)
- 【bzoj1003】【ZJOI2006】【物流运输】【最短路+dp】
- bzoj 1003: [ZJOI2006]物流运输【spfa+dp】
- 【BZOJ】1003 [ZJOI2006]物流运输 最短路径+DP