【luogu】P1772物流运输(最短路+DP)
题目链接
对于本题我们设ext[i][j]计算第i个码头在前j天总共有几天不能用(其实就一前缀和),设dis[i][j]是从第i天到第j天不变运输路线的最短路径,设f[i]是前i天运输货物的最小花费。
然后n2*O(spfa)处理出整个dis数组。判断一个码头a从第i天到第j天能不能用的方法是ext[a][j]-ext[a][i-1],如果该数等于0,则说明这几天没有一天不能用,则spfa的时候可以扩展到该码头;否则至少有一天不能用,spfa的时候也就不能扩展。
接着f[i]=min(f[i],f[j]+dis[j+1][i]*(i-j)+k) 其中i-j是天数,j是枚举的从哪天开始换路线。
最后f[n]即是答案。
放上代码
#include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<cctype> #include<algorithm>inline int read(){int num=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){num=num*10+ch-'0';ch=getchar();}return num*f; }using namespace std; queue <int> q; bool vis[100200]; int dst[1500]; int dis[150][150]; int n,m,o,e;int ext[30][150];struct Edge{int next,to,val; }edge[1000200]; int head[12000],num; inline void add(int from,int to,int val){edge[++num]=(Edge){head[from],to,val};head[from]=num; }void Spfa(int s,int t){q.push(1);memset(dst,127/3,sizeof(dst));dst[1]=0;while(!q.empty()){int from=q.front(); q.pop();vis[from]=0;for(int i=head[from];i;i=edge[i].next){int to=edge[i].to;if(ext[to][t]-ext[to][s-1]>0) continue;if(dst[to]>dst[from]+edge[i].val){dst[to]=dst[from]+edge[i].val;if(vis[to]) continue;q.push(to); vis[to]=1;}}}dis[s][t]=dst[m]; }long long f[2000];int main(){memset(f,127/3,sizeof(f));memset(dis,127/3,sizeof(dis));n=read(),m=read(),o=read(),e=read();f[0]=-o;for(int i=1;i<=e;++i){int from=read(),to=read(),val=read();add(from,to,val);add(to,from,val);}int T=read();for(int i=1;i<=T;++i){int x=read(),a=read(),b=read();for(int j=a;j<=b;++j) ext[x][j]=1;}for(int i=1;i<=m;++i)for(int j=1;j<=n;++j) ext[i][j]+=ext[i][j-1];for(int i=1;i<=n;++i)for(int j=i;j<=n;++j)Spfa(i,j);for(int i=1;i<=n;++i)for(int j=0;j<i;++j){if(dis[j+1][i]==dis[0][0]) continue;f[i]=min(f[i],f[j]+dis[j+1][i]*(i-j)+o);}printf("%d",f[n]);return 0; }
转载于:https://www.cnblogs.com/cellular-automaton/p/7891281.html
【luogu】P1772物流运输(最短路+DP)相关推荐
- P1772 [ZJOI2006]物流运输 最短路+DP
思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...
- 【bzoj1003】[ZJOI2006]物流运输 最短路+dp
传送门:嘿原题在这 题意:给出一个图,求1-m的最短路,但其中有些点在某些时间段会不能用,题目保证有解. 我们可以很(不)容易的看出递推关系式dp[i]=min(dp[i],dp[j]+cost[j+ ...
- BZOJ 1003 物流运输 最短路+dp
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1003 题目大意: 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才 ...
- bzoj1003 [ZJOI2006]物流运输(最短路+dp)
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严 ...
- 1003. [ZJOI2006]物流运输【区间DP+最短路】
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严 ...
- BZOJ 1003 物流运输trans dijstra+dp
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1003 题意: 题解: 首先我们必须机智的知道f[i]=min(f[i],f[j]+cos ...
- P1772 [ZJOI2006]物流运输(线性dp+最短路径)
P1772 [ZJOI2006]物流运输 题意 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头 A 运到码头 B.由于货物量比较大,需要 nnn 天才能运完.货物运输过程中一般要转 ...
- BZOJ1003 物流运输(dp+spfa)
题目: 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8000 Solved: 3343 [Submit][ ...
- BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit ...
最新文章
- adoquery查询结果如何赋给一个变量(delphi和c++ builder)
- ubuntu 安装ndk
- 深入理解javascript原型和闭包(10)——this
- Golang——Tag、自定义类型、未命名类型
- in会让mysql索引失效吗_mysql的in会不会让索引失效?
- 小玉买文具(洛谷-P1421)
- hdoj1290切球形蛋糕(递推和划分问题)
- LevelDB源码分析之四:AtomicPointer
- bt服务器搭建 linux_linux系统架设BT服务器的详细教程
- HanLP自然语言处理包开源
- Python编程:从入门到时间 第五、六章学习笔记
- 解决训练时显存不断增大问题
- 3DMax2014试用结束后激活教程
- 连接服务器没有发挥作用,iPhone“连到系统上的设备没有发挥作用”原因分析及解决方法...
- OPencv无损保存图片
- html设置字段只读,html怎么设置只读
- win7系统如何备份还原,win7系统映像备份与恢复
- Microsoft Office Word 2010-2016中公式不能自动斜体的解决方法
- BI平台:怎么进行报表的开发和搭建
- vue将页面html导出为pdf
热门文章
- JavaScript浏览器对象Window对象常用方法(3)
- 计算一个连通分量中节点的个数的两种方法
- 下拉框怎么获取label_拼多多-「关键词自然流量快速获取」访客暴涨秘诀
- 2016蓝桥杯C++A:网友年龄
- Unity3D基础35:五彩砖块
- nlogn最长单调递增
- [debug] 延长Linux中sudo密码在终端的有效时间
- [paper reading] RetinaNet
- Git使用-.gitignore文件(使一些文件不上传到git)
- python批量实现将文件夹内的每张图片分割成多张