题意:链接

方法:SPFA+DP

解析:挺好的题目。因为数据范围较小所以用这样的方式能够搞,只是也是挺不好想的。

我们定义cost(i,j)表示从第i天走到第j天运用同一种方式的最小花费,然后因为数据比較小,我们定义f[i]表示前i天的最小花费。

接下来我们就能够写出来转移方程了

f[i]=minf[i],f[j]+K+cost(j+1,i)

j比i小。

然后就能够水过了!

顺带提一下,在计算cost(j+1,i)时,要考虑每一个限制区段的预处理,也就是哪些点在这些天中均可走。

代码

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. #define N 110
  7. #define M 10100
  8. #define INF 0x3f3f3f3f
  9. using namespace std;
  10. int n,m,K,e,d,cnt;
  11. int v[N],can[N],f[N];
  12. struct node
  13. {
  14. int to;
  15. int next;
  16. int val;
  17. }edge[M];
  18. int head[N],dis[N];
  19. struct limit
  20. {
  21. int p,a,b;
  22. }l[M];
  23. //f[i]=max(c(1,i),f[j]+k+c(j+1,i));
  24. void init()
  25. {
  26. memset(head,-1,sizeof(head));
  27. cnt=1;
  28. }
  29. void edgeadd(int from,int to,int val)
  30. {
  31. edge[cnt].to=to;
  32. edge[cnt].val=val;
  33. edge[cnt].next=head[from];
  34. head[from]=cnt++;
  35. }
  36. int cost(int le,int ri)
  37. {
  38. memset(can,0,sizeof(can));
  39. for(int i=1;i<=d;i++)
  40. {
  41. if(max(le,l[i].a)<=min(ri,l[i].b))can[l[i].p]=1;
  42. }
  43. memset(dis,0x3f,sizeof(dis));
  44. memset(v,0,sizeof(v));
  45. queue<int>q;
  46. q.push(1);
  47. v[1]=1;
  48. dis[1]=0;
  49. while(!q.empty())
  50. {
  51. int u=q.front();
  52. q.pop();
  53. v[u]=0;
  54. for(int i=head[u];i!=-1;i=edge[i].next)
  55. {
  56. int to=edge[i].to;
  57. if(can[to])continue;
  58. if(dis[u]+edge[i].val<dis[to])
  59. {
  60. dis[to]=dis[u]+edge[i].val;
  61. if(!v[to])
  62. {
  63. q.push(to);
  64. v[to]=1;
  65. }
  66. }
  67. }
  68. }
  69. if(dis[m]==INF)return INF;
  70. return dis[m]*(ri-le+1);
  71. }
  72. int main()
  73. {
  74. init();
  75. scanf("%d%d%d%d",&n,&m,&K,&e);
  76. for(int i=1;i<=e;i++)
  77. {
  78. int x,y,z;
  79. scanf("%d%d%d",&x,&y,&z);
  80. edgeadd(x,y,z);
  81. edgeadd(y,x,z);
  82. }
  83. scanf("%d",&d);
  84. for(int i=1;i<=d;i++)scanf("%d%d%d",&l[i].p,&l[i].a,&l[i].b);
  85. for(int i=1;i<=n;i++)
  86. {
  87. f[i]=cost(1,i);
  88. for(int j=1;j<i;j++)
  89. {
  90. f[i]=min(f[i],f[j]+K+cost(j+1,i));
  91. }
  92. }
  93. printf("%d\n",f[n]);
  94. }

BZOJ 1003 [ZJOI2006]物流运输trans SPFA+DP的更多相关文章

  1. 【BZOJ1003】1003: [ZJOI2006]物流运输trans SPFA+DP

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

  2. BZOJ 1003: [ZJOI2006]物流运输(spfa+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1003 题意: 思路: 首先用spfa计算一下任意两天之内的最短路,dis[a][b]表示的就是在第a ...

  3. BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 思路 先Dijkstra暴力求出i..j天内不变换路线的最少花费,然后dp[i] = ...

  4. bzoj 1003: [ZJOI2006]物流运输【spfa+dp】

    预处理出ans[i][j]为i到j时间的最短路,设f[i]为到i时间的最小代价,转移显然就是 f[i]=min(f[j-1]+ans[j][i]*(i-j+1)+k); #include<ios ...

  5. BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)

    1A,爽! cost[i][j]表示从第i天到第j天不改路线所需的最小花费,这个可以用最短路预处理出.然后dp(i)=cost[j][i]+dp(j-1)+c. c为该路线的花费. --------- ...

  6. BZOJ 1003 [ZJOI2006]物流运输trans

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

  7. BZOJ 1003: [ZJOI2006]物流运输trans DP+最短路

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

  8. BZOJ 1003 ZJOI2006 物流运输trans 动态规划+SPFA

    标题效果:给定一个无向图.输送n日,有一天的某一时刻不能去,更换行考虑k,求总成本 一阶cost[i][j]用于第一i为了天j天正在同一航线的最低消费 这种利用SPFA处理 然后就是移动的法规问题 订 ...

  9. BZOJ-1003 物流运输trans SPFA+DP

    傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...

随机推荐

  1. WebGL学习(1) - 三角形

    原文地址:WebGL学习(1) - 三角形 还记得第一次看到canvas的粒子特效的时候,真的把我给惊艳到了,原来在浏览器也能做出这么棒的效果.结合<HTML5 Canvas核心技术>和网 ...

  2. [java基础] 遇到的一个关于返回值泛型的问题

    在写代码的时候这样写: import java.util.ArrayList; import java.util.List; public class TestConversion { public ...

  3. whonix官网部分翻译

    Whonix:一个高安全的方式来Surfing the Internet Whonix是一个桌面操作系统,被设计用于高级安全和隐私.It realistically addresses attacks ...

  4. C语言控制流语句

    title: 2017-10-18控制流 tags: binsearch else-if, shellsort, insertsort grammar_cjkRuby: true --- 前段时间忙着 ...

  5. 裴波那契查找详解 - Python实现

    裴波那契查找(Fibonacci Search)是利用黄金分割原理实现的查找方法. 斐波那契查找的核心是: 1.当key == a[mid]时,查找成功: 2.当key < a[mid]时,新的 ...

  6. matlab之“audioread”函数帮助文档翻译

    课 程 设 计 (1)  原文 audioread Read audio file Syntax [y,Fs] = audioread(filename) [y,Fs] = audioread(fil ...

  7. 书籍推荐系列之一 -- 《凤凰项目:一个IT运维的传奇故事》

    博客已经完全更新了名字,新的名字,新的开始,想让自走向新的道路是很难的,走出舒适圈说了好久,也是时候开始行动了,今天就从写博客开始. 今天给大家推荐一本书,<凤凰项目:一个IT运维的传奇故事&g ...

  8. 详谈Javascript类与继承

    本文将从以下几方面介绍类与继承 类的声明与实例化 如何实现继承 继承的几种方式 类的声明与实例化 类的声明一般有两种方式 //类的声明 var Animal = function () { this. ...

  9. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  10. gulp 小坑一个

    学习gulp的时候,看到很多人写到 gulp.task('styles', function() { return gulp.src('src/styles/main.scss') .pipe(sas ...