bzoj1003: [ZJOI2006]物流运输(最短路+Dp)
来源:互联网 发布:珠宝设计软件手机 编辑:程序博客网 时间:2024/06/03 06:05
题目传送门
首先这道题肯定有连续几天的航行是一样的。
那么我们不用去求出每天的方案。
只需求出每一段(连续的几天)的最短路然后*天数即可。
不难想到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,不能为falseint 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[n]); return 0;}
大概就这样吧。
阅读全文
0 0
- [BZOJ1003]ZJOI2006 物流运输 |最短路|DP
- 【bzoj1003】【ZJOI2006】【物流运输】【dp+最短路】
- 【bzoj1003】【ZJOI2006】【物流运输】【最短路+dp】
- 【DP+最短路】BZOJ1003 [ZJOI2006]物流运输
- bzoj1003 [ZJOI2006]物流运输(最短路+dp)
- BZOJ1003(ZJOI2006)[物流运输]--最短路+DP
- [BZOJ1003][ZJOI2006]物流运输(最短路+dp)
- bzoj1003: [ZJOI2006]物流运输(最短路+Dp)
- [BZOJ1003][ZJOI2006]物流运输(最短路+dp)
- [BZOJ1003][ZJOI2006]物流运输(最短路+DP)
- 【BZOJ1003】物流运输(ZJOI2006)-DP+最短路
- bzoj1003: [ZJOI2006]物流运输trans[最短路+DP]
- 【bzoj1003】【最短路+DP】【ZJOI2006】物流运输trans
- 【bzoj1003】[ZJOI2006]物流运输trans 最短路+dp
- 【BZOJ1003】[ZJOI2006]物流运输trans【最短路】【DP】
- 最短路+DP——BZOJ1003/Luogu1772 [ZJOI2006]物流运输
- bzoj1003 [ZJOI2006]物流运输(spfa+dp)
- [DP] BZOJ1003: [ZJOI2006]物流运输
- oracle学习总结(一)
- The best way to improve your listening
- WKWebView自动弹出键盘和隐藏输入附属视图(inputAccessoryView)
- 【NOIP2017提高A组模拟9.7】简单无向图 dp
- HDU 4472 count(递推)
- bzoj1003: [ZJOI2006]物流运输(最短路+Dp)
- n结点树至少删多少边才变成p结点树
- 如何写SysV服务管理脚本
- C#中as和is的用法
- Java基础学习总结(115)——Java 类加载机制详解
- 当工作压力比较显著
- 词向量源码解析:(5.6)ngram2vec源码解析之pairs2counts
- java 方法的重载(overloading)与重写(overwriting)
- c++经典面试题