【题解】物流运输 [ZJ2006] [P1772] [BZOJ1003]
【题解】物流运输 [ZJ2006] [P1772] [BZOJ1003]
传送门:物流运输 \([ZJ2006]\) \([P1772]\) \([BZOJ1003]\)
【题目描述】
给定一个含 \(e\) 条带权边的无向图,每天都需要从结点 \(1\) 走到结点 \(m\),一共要走 \(n\) 天,每天的花费为所经过路径的权值和。一般来说会选择一条路线每天都这样走下去,但某些结点会在连续的几天内都无法经过,这时候就需要改变路线。每次改变路线都有 \(K\) 的额外花费。求最小总花费。
(即:总花费 \(=\) \(n\) 天经过路径花费和 \(+\) \(K*\) 改变路径次数)
【输入】
第一行四个整数 \(n,m,K,e\),后面 \(e\) 行表示每条边所连接的结点编号和边权。接下来一个整数 \(T\) 表示有 \(T\) 个结点会在某一时段无法通过,后面每行三个整数分别表示节点编号,无法通过的天数起点和终点。
【输出】
一个整数表示最小花费。
【样例】
样例输入:
5 5 10 8
1 2 1
1 3 3
1 4 2
2 3 2
2 4 4
3 4 1
3 5 2
4 5 2
4
2 2 3
3 1 1
3 3 3
4 4 5
样例输出:
32
【数据范围】
\(100\%\) \(1 \leqslant N \leqslant 100,\) \(1 \leqslant m \leqslant 20\)
【分析】
暂时先不考虑如何计算路径花费的问题,就先视作 \(w\) 好了。
很明显,状态转移的切入点在于路径的改变。用 \(dp[i]\) 表示走完前 \(i\) 天所需最小花费,设最后一次改变路径后使用的天数为 \([j+1,i]\),那么 \(dp[i]=min\{dp[j]+K+w*(i-j)\}\) 。
一开始看到这个式子还以为是斜率优化,但实际上并不需要,这么良心的数据直接暴力就能过。
求 \(w\) 可以使用 \(dijkstra\) 或者 \(SPFA\),不能走的结点就提前记录一下。可以用 \(no[i][j]\) 表示 \(i\) 在 \(j\) 这天不可走,转移状态时倒序枚举 \(j\)。由于 \(j+1\) 这天不可经过的点在 \(j\) 这天还是不可经过,这样做就可以省掉一些麻烦。
另外,如果 \(inf\) 设太大的话,两个 \(inf\) 相乘会爆 \(long\) \(long\),要特判一下。
初始化有两种方法:\(dp[i]=w*i(i \in [1,n])\) 或者 \(dp[0]=-K\),如果是后者,在第 \(0\) 天后改变路径并加上 \(K\) 的花费,实际上就是 \(0\) 花费选出了第一条路径。
时间复杂度为:\(O(n^2mlogm)\) 。
【Code】
#include<algorithm>
#include<cstdio>
#include<queue>
#define LL long long
#define Re register LL
using namespace std;
const LL N=103,M=403,inf=1e18;
LL n,m,e,o,x,y,z,K,to,dp[N],dis[N],pan[N],can[N],head[N],no[N][N];
struct QAQ{LL w,to,next;}a[M<<1];
struct QWQ{LL x,d;inline bool operator<(QWQ o)const{return d>o.d;}};
priority_queue<QWQ>Q;
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
inline void add(Re x,Re y,Re z){a[++o].to=y,a[o].w=z,a[o].next=head[x],head[x]=o;}
inline LL dijkstra(){
for(Re i=0;i<=m;++i)pan[i]=0;
for(Re i=0;i<=m;++i)dis[i]=inf;
pan[1]=0,Q.push((QWQ){1,dis[1]=0});
while(!Q.empty()){
x=Q.top().x,Q.pop();
if(pan[x]||can[x])continue;
pan[x]=1;
for(Re i=head[x];i;i=a[i].next)
if(dis[to=a[i].to]>dis[x]+a[i].w){
dis[to]=dis[x]+a[i].w;
Q.push((QWQ){to,dis[to]});
}
}
return dis[m];
}
int main(){
in(n),in(m),in(K),in(e);
while(e--)in(x),in(y),in(z),add(x,y,z),add(y,x,z);
in(e);
while(e--){
in(x),in(y),in(z);
for(Re i=y;i<=z;++i)no[x][i]=1;
}
for(Re i=0;i<=n;++i)dp[i]=inf;dp[0]=-K;
for(Re i=1;i<=n;++i){
for(Re k=1;k<=m;++k)can[k]=0;
for(Re j=i-1;j>=0;--j){
for(Re k=1;k<=m;++k)can[k]|=no[k][j+1];
Re tmp=dijkstra();
if(tmp!=inf)dp[i]=min(dp[i],dp[j]+K+(i-j)*tmp);
}
}
printf("%lld",dp[n]);
}
【题解】物流运输 [ZJ2006] [P1772] [BZOJ1003]的更多相关文章
- 【BZOJ1003】物流运输(动态规划,最短路)
[BZOJ1003]物流运输(动态规划,最短路) 题面 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司 ...
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)
P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...
- bzoj1003物流运输 最短路+DP
bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...
- BZOJ 1003 物流运输 题解 【SPFA+DP】
BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...
- BZOJ1003: [ZJOI2006] 物流运输 trans
物流运输--看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么 dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i}) 就是从 ...
- 洛谷P1772 [ZJOI2006]物流运输
P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...
- bzoj1003: [ZJOI2006]物流运输(DP+spfa)
1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...
- 【BZOJ1003】【ZJOI2006】物流运输
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2556 Solved: 1008[Submit] ...
随机推荐
- vscode vue 去掉语法提示
在vscode中,点击file->preferences->settings, 然后输入vetur, 滚到最下面,那个勾去掉,然后关闭,重启vscode就可以了
- Django框架(十五)-- cookie和session组件
一.cookie 1.cookie的由来 HTTP协议是无状态的.无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直 ...
- 第一部分day5 文件操作
#-----文件操作----- 文件操作模式 1."r" 读 2."w" 清空写入 3."a" 追加 4."r+" 读写 ...
- POJ3070 斐波那契数列递推 矩阵快速幂模板题
题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...
- 测试基础【第六篇】bug要素及其生命周期
bug的要素 为了让开发人员更准确.更快的看懂Bug,测试需要按照一定的规范提交bug. 缺陷id:一般由缺陷管理系统自动生成: 缺陷标题:概要描述缺陷: 发现人:一般是缺陷管理系统自动获取当前用户: ...
- zzulioj - 2558 数字的差值
首先感谢抱抱熊dalao的题解,提供了一种比较简单的思路.[抱抱熊dalao的题解](https://note.youdao.com/ynoteshare1/index.html?id=52f087d ...
- Vim编辑器点滴积累
Vim编辑器点滴积累 vim tab键空格数量控制 参考链接 临时:进入VIM,执行: :set tabstop=4 永久:编辑用户目录下.vimrc文件,添加:set tabstop=4 vim 安 ...
- python paramiko与linux的连接
两种使用paramiko连接到linux服务器的代码 方式一: 1 ssh = paramiko.SSHClient() 2 ssh.set_missing_host_key_policy(param ...
- 在eclipse中新建java问题报错:The type XXX cannot be resolved. It is indirectly referenced from required .class files
在Eclipse中遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误 ...
- Ubuntu16.04安装Filebeat
Filebeat官方文档地址 https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html 下载和 ...