【题解】物流运输 [ZJ2006] [P1772] [BZOJ1003]

传送门:物流运输 \([ZJ2006]\) \([P1772]\) \([BZOJ1003]\)

【题目描述】

给定一个含 \(e\) 条带权边的无向图,每天都需要从结点 \(1\) 走到结点 \(m\),一共要走 \(n\) 天,每天的花费为所经过路径的权值和。一般来说会选择一条路线每天都这样走下去,但某些结点会在连续的几天内都无法经过,这时候就需要改变路线。每次改变路线都有 \(K\) 的额外花费。求最小总花费。

(即:总花费 \(=\) \(n\) 天经过路径花费和 \(+\) \(K*\) 改变路径次数)

【输入】

第一行四个整数 \(n,m,K,e\),后面 \(e\) 行表示每条边所连接的结点编号和边权。接下来一个整数 \(T\) 表示有 \(T\) 个结点会在某一时段无法通过,后面每行三个整数分别表示节点编号,无法通过的天数起点和终点。

【输出】

一个整数表示最小花费。

【样例】

  1. 样例输入:
  2. 5 5 10 8
  3. 1 2 1
  4. 1 3 3
  5. 1 4 2
  6. 2 3 2
  7. 2 4 4
  8. 3 4 1
  9. 3 5 2
  10. 4 5 2
  11. 4
  12. 2 2 3
  13. 3 1 1
  14. 3 3 3
  15. 4 4 5
  16. 样例输出:
  17. 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】

  1. #include<algorithm>
  2. #include<cstdio>
  3. #include<queue>
  4. #define LL long long
  5. #define Re register LL
  6. using namespace std;
  7. const LL N=103,M=403,inf=1e18;
  8. LL n,m,e,o,x,y,z,K,to,dp[N],dis[N],pan[N],can[N],head[N],no[N][N];
  9. struct QAQ{LL w,to,next;}a[M<<1];
  10. struct QWQ{LL x,d;inline bool operator<(QWQ o)const{return d>o.d;}};
  11. priority_queue<QWQ>Q;
  12. inline void in(Re &x){
  13. int f=0;x=0;char c=getchar();
  14. while(c<'0'||c>'9')f|=c=='-',c=getchar();
  15. while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
  16. x=f?-x:x;
  17. }
  18. 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;}
  19. inline LL dijkstra(){
  20. for(Re i=0;i<=m;++i)pan[i]=0;
  21. for(Re i=0;i<=m;++i)dis[i]=inf;
  22. pan[1]=0,Q.push((QWQ){1,dis[1]=0});
  23. while(!Q.empty()){
  24. x=Q.top().x,Q.pop();
  25. if(pan[x]||can[x])continue;
  26. pan[x]=1;
  27. for(Re i=head[x];i;i=a[i].next)
  28. if(dis[to=a[i].to]>dis[x]+a[i].w){
  29. dis[to]=dis[x]+a[i].w;
  30. Q.push((QWQ){to,dis[to]});
  31. }
  32. }
  33. return dis[m];
  34. }
  35. int main(){
  36. in(n),in(m),in(K),in(e);
  37. while(e--)in(x),in(y),in(z),add(x,y,z),add(y,x,z);
  38. in(e);
  39. while(e--){
  40. in(x),in(y),in(z);
  41. for(Re i=y;i<=z;++i)no[x][i]=1;
  42. }
  43. for(Re i=0;i<=n;++i)dp[i]=inf;dp[0]=-K;
  44. for(Re i=1;i<=n;++i){
  45. for(Re k=1;k<=m;++k)can[k]=0;
  46. for(Re j=i-1;j>=0;--j){
  47. for(Re k=1;k<=m;++k)can[k]|=no[k][j+1];
  48. Re tmp=dijkstra();
  49. if(tmp!=inf)dp[i]=min(dp[i],dp[j]+K+(i-j)*tmp);
  50. }
  51. }
  52. printf("%lld",dp[n]);
  53. }

【题解】物流运输 [ZJ2006] [P1772] [BZOJ1003]的更多相关文章

  1. 【BZOJ1003】物流运输(动态规划,最短路)

    [BZOJ1003]物流运输(动态规划,最短路) 题面 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司 ...

  2. 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp

    「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...

  3. [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...

  4. bzoj1003物流运输 最短路+DP

    bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...

  5. BZOJ 1003 物流运输 题解 【SPFA+DP】

    BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...

  6. 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}) 就是从 ...

  7. 洛谷P1772 [ZJOI2006]物流运输

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...

  8. bzoj1003: [ZJOI2006]物流运输(DP+spfa)

    1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...

  9. 【BZOJ1003】【ZJOI2006】物流运输

    1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2556  Solved: 1008[Submit] ...

随机推荐

  1. SharePoint Rest Api Caml multiple condition query -Rest api 利用Caml多个条件查询

    $.ajax({ var cquery="<View><Query><Where><And><Geq><FieldRef N ...

  2. Linux shell awk逻辑控制语句

    awk逻辑控制语句 1,if...else 格式: if(条件){语句:语句} else {语句1:语句2} 如果statement只有一条语句,{}可以不写 以冒号为分隔符,判断第一个字段,如果为r ...

  3. Linux的httpd服务介绍和部署

    软件介绍 客户端代理软件     IE,firefox,chroome,opera      服务器端软件      httpd,Nginx,Tengine,ISS,Lighthttp       应 ...

  4. 解决postMessage跨域问题

    在HTML5中新增了postMessage方法,postMessage可以实现跨文档消息传输(Cross Document Messaging),Internet Explorer 8, Firefo ...

  5. 目标检测论文解读7——YOLO v2

    背景 YOLO v1检测效果不好,且无法应用于检测密集物体. 方法 YOLO v2是在YOLO v1的基础上,做出如下改进. (1)引入很火的Batch Normalization,提高mAP和训练速 ...

  6. dapi 基于Django的轻量级测试平台七 怎样部署到生产环境

    QQ群: GitHub:https://github.com/yjlch1016/dapi Nginx+uWSGI 前置条件:以下所有操作均在root账号下面进行如果不是root用户请注意权限问题因为 ...

  7. vue-router路由高亮效果

    审查代码,查看激活类名 (1)设置激活类名样式 (2)也可以在路由文件里配置激活类名的别名 (3)配置别名后再次审查,如下所示 此时可以直接配置active类名样式即可 此时便可以实现路由高亮效果 .

  8. 网络协议 16 - DNS 协议

    为什么在地址栏输入域名,就能直接访问到对应服务器?全局负载均衡和内部负载均衡又是什么?这些都和 DNS 解析息息相关,让我们一起来解密 DNS 解析.     其实说起 DNS 解析,应该都知道它很像 ...

  9. salt 安装

    list: centos 6.5 x86_64 172.18.39.28 mast.test.com 172.18.39.27 mini.test.com master:#sudo yum insta ...

  10. Python(一)对 meta class 的理解

    1. 理解  class 对于 class 来说,表示一个代码块规定了实例化后的 object 的属性和方法 但是在 Python 中,class 本身也是对象.定义一个 class,就相当于在内存中 ...