题目描述

物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。

输入输出格式

输入格式:

第一行是四个整数n(l≤n≤100)、m(l≤m≤20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本,e表示航线条数。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来一行是一个整数d,后面的d行每行是三个整数P(1 < P < m),a,b(1≤a≤b≤n)。表示编号为P的码头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头A到码头B的运输路线。

输出格式:

包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。

输入输出样例

输入样例#1: 复制

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

最短路+dp。

首先spfa预处理出每两天之间的最短路,在进行转移。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 105;
  4. struct Edge{
  5. int nxt,to,val;
  6. }edge[MAXN*MAXN];
  7. int n,m,e,k,head[MAXN],cnt,d,dis[MAXN];
  8. long long srt[MAXN][MAXN];
  9. long long dp[MAXN];
  10. bool used[MAXN][MAXN],vis[MAXN],now[MAXN];
  11. inline void add(int bg,int ed,int w){
  12. edge[++cnt].to=ed;
  13. edge[cnt].val=w;
  14. edge[cnt].nxt=head[bg];
  15. head[bg]=cnt;
  16. }
  17. inline long long spfa(int a,int b){
  18. queue<int> q;
  19. for(register int i=1;i<=m;i++) dis[i]=1e5+5;
  20. memset(vis,false,sizeof(vis));
  21. memset(now,false,sizeof(now));
  22. for(register int i=1;i<=m;i++)
  23. for(register int j=b;j<=a;j++)
  24. if(used[i][j]) now[i]=1;
  25. vis[1]=1;dis[1]=0;q.push(1);
  26. while(q.size()){
  27. int x=q.front();q.pop();
  28. vis[x]=0;
  29. for(register int i=head[x];i;i=edge[i].nxt){
  30. int u=edge[i].to;
  31. if(now[u]) continue;
  32. if(dis[u]>dis[x]+edge[i].val){
  33. dis[u]=dis[x]+edge[i].val;
  34. if(!vis[u]){
  35. vis[u]=1;
  36. q.push(u);
  37. }
  38. }
  39. }
  40. }
  41. return dis[m];
  42. }
  43. int main(){
  44. scanf("%d%d%d%d",&n,&m,&k,&e);
  45. for(register int i=1;i<=e;i++){
  46. int a,b,c;
  47. scanf("%d%d%d",&a,&b,&c);
  48. add(a,b,c);
  49. add(b,a,c);
  50. }
  51. scanf("%d",&d);
  52. for(register int i=1;i<=d;i++){
  53. int a,b,c;
  54. scanf("%d%d%d",&a,&b,&c);
  55. for(register int j=b;j<=c;j++)
  56. used[a][j]=1;
  57. }
  58. for(register int i=1;i<=n;i++)
  59. for(register int j=1;j<=n;j++)
  60. srt[j][i]=spfa(i,j);
  61. for(register int i=1;i<=n;i++){
  62. dp[i]=(long long)srt[1][i]*i;
  63. for(register int j=1;j<i;j++)
  64. dp[i]=min(dp[i],dp[j]+k+(long long)srt[j+1][i]*(i-j));
  65. }
  66. // for(register int i=1;i<=n;i++) cout<<dp[i]<<endl;
  67. printf("%lld",dp[n]);
  68. return 0;
  69. }

ZJOI 2006 物流运输 bzoj1003的更多相关文章

  1. [BZOJ1003](ZJOI 2006) 物流运输trans

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

  2. [ZJOI 2006]物流运输

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

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

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

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

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

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

    [题解]物流运输 [ZJ2006] [P1772] [BZOJ1003] 传送门:物流运输 \([ZJ2006]\) \([P1772]\) \([BZOJ1003]\) [题目描述] 给定一个含 \ ...

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

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

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

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

  8. BZOJ1003 物流运输 最短路+DP

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

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

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

随机推荐

  1. 任意两点间的最短路问题(Floyd-Warshall算法)

    /* 任意两点间的最短路问题(Floyd-Warshall算法) */ import java.util.Scanner; public class Main { //图的顶点数,总边数 static ...

  2. delphi获得文件大小

    大概有这些方法可以获得文件大小 FileSizeByName(需要引用IdGlobal单元) GetFileSize FileSize(不能获得正在使用的文件大小) FileSeek TFileStr ...

  3. hive的数据压缩

    hive的数据压缩 在实际工作当中,hive当中处理的数据,一般都需要经过压缩,前期我们在学习hadoop的时候,已经配置过hadoop的压缩,我们这里的hive也是一样的可以使用压缩来节省我们的MR ...

  4. NX二次开发-UFUN写入本地文本文档uc4524

    1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_cfi.h> 5 #include <uf_ui.h> 6 7 us ...

  5. NX二次开发-UFUN编辑添加哪些图层UF_LAYER_edit_category_layer

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_layer.h> 5 6 7 UF_initialize(); 8 9 //创 ...

  6. 奇思妙想:利用野指针和lower_bound()/upper_bound()函数实现整数二分

    众所周知,c++的STL中提供了三个二分查找函数,binary_search(),lower_bound(),upper_bound(),功能分别是找某值是否在数组中出现,找到数组中第一个大于等于某值 ...

  7. c语言NULL和0区别及NULL详解

      先看下面一段代码输出什么: #include<stdo.h> int main() { int *p=NULL; printf("%s",p); } 输出<n ...

  8. sql 生成javabean实体

    select a.name,c.name,b.name,'private String '+lower(c.name)+';' from sysobjects a, systypes b, sysco ...

  9. Git 本地仓库管理

    目录 目录 基本概念 配置 配置个人帐号信息 安装 本地版本库 创建 Git 仓库 Git 仓库版本回退 修改管理 基本概念 工作区(Working Directory): 就是你在电脑里能看到的目录 ...

  10. iOS之NSArray数组排序

    一.数组遍历 除了常用的for和for-in遍历外,系统还提供了三种枚举遍历,对于大量的数据遍历可以使用下列三个方法. - (void)enumerateObjectsUsingBlock:(void ...