1579: [Usaco2009 Feb]Revamping Trails 道路升级

Description

每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <= 1,000,000)时间单位用道路i从P1_i走到P2_i或者从P2_i 走到P1_i 他想更新一些路经来减少每天花在路上的时间.具体地说,他想更新K (1 <= K <= 20)条路经,将它们所须时间减为0.帮助FJ选择哪些路经需要更新使得从1到N的时间尽量少.

Input

* 第一行: 三个空格分开的数: N, M, 和 K * 第2..M+1行: 第i+1行有三个空格分开的数:P1_i, P2_i, 和 T_i

Output

* 第一行: 更新最多K条路经后的最短路经长度.

Sample Input

4 4 1
1 2 10
2 4 10
1 3 1
3 4 100

Sample Output

1

HINT

K是1; 更新道路3->4使得从3到4的时间由100减少到0. 最新最短路经是1->3->4,总用时为1单位. N<=10000

Source

【分析】

  就是一个分层图最短路,spfa过不了。。所以这是我第一次打迪杰斯特拉???

  dij:分st,ed,两个联盟,每次找dis最小的x加入st联盟,根据他连出去的边更新dis,然后继续做。。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8. #define Maxn 10010
  9. #define Maxm 50010
  10. #define Maxk 25
  11. #define INF 0xfffffff
  12.  
  13. struct node
  14. {
  15. int x,y,c,next;
  16. }t[*Maxm];int len=;
  17.  
  18. int first[Maxn];
  19. int n,m,k;
  20.  
  21. void ins(int x,int y,int c)
  22. {
  23. t[++len].x=x;t[len].y=y;t[len].c=c;
  24. t[len].next=first[x];first[x]=len;
  25. }
  26.  
  27. int mymin(int x,int y) {return x<y?x:y;}
  28.  
  29. int id[Maxn][Maxk],wh[Maxn*Maxk][];
  30. int cnt=;
  31.  
  32. struct hp
  33. {
  34. int d,x;
  35. friend bool operator < (hp x,hp y)
  36. {
  37. return x.d>y.d;
  38. }
  39. };
  40.  
  41. bool mark[Maxn*Maxk];
  42. int dis[Maxn*Maxk];
  43. priority_queue<hp > q;
  44. void dij(int st)
  45. {
  46. while(!q.empty()) q.pop();
  47. memset(mark,,sizeof(mark));
  48. memset(dis,,sizeof(dis));
  49. q.push((hp){,st});dis[st]=;
  50. while(!q.empty())
  51. {
  52. while(!q.empty()&&mark[q.top().x]) q.pop();
  53. if(q.empty()) break;
  54. hp x=q.top();q.pop();
  55. int xx=wh[x.x][],kk=wh[x.x][];
  56. mark[x.x]=;
  57. for(int i=first[xx];i;i=t[i].next)
  58. {
  59. int y=t[i].y;
  60. if(mark[id[y][kk]]) continue;
  61. if(dis[id[y][kk]]>dis[x.x]+t[i].c)
  62. {
  63. dis[id[y][kk]]=dis[x.x]+t[i].c;
  64. q.push((hp){dis[id[y][kk]],id[y][kk]});
  65. }
  66. if(kk<k)
  67. {
  68. if(dis[id[y][kk+]]>dis[x.x])
  69. {
  70. dis[id[y][kk+]]=dis[x.x];
  71. q.push((hp){dis[id[y][kk+]],id[y][kk+]});
  72. }
  73. }
  74. }
  75. }
  76. }
  77.  
  78. int main()
  79. {
  80. scanf("%d%d%d",&n,&m,&k);
  81. memset(first,,sizeof(first));
  82.  
  83. for(int i=;i<=n;i++)
  84. for(int j=;j<=k;j++)
  85. id[i][j]=++cnt,wh[cnt][]=i,wh[cnt][]=j;
  86.  
  87. for(int i=;i<=m;i++)
  88. {
  89. int x,y,c;
  90. scanf("%d%d%d",&x,&y,&c);
  91. ins(x,y,c);ins(y,x,c);
  92. }
  93.  
  94. dij(id[][]);
  95. int ans=INF;
  96. for(int i=;i<=k;i++) ans=mymin(ans,dis[id[n][i]]);
  97. printf("%d\n",ans);
  98. return ;
  99. }

2017-01-15 10:48:33

【BZOJ 1579】 1579: [Usaco2009 Feb]Revamping Trails 道路升级 (最短路)的更多相关文章

  1. BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )

    最短路...多加一维表示更新了多少条路 -------------------------------------------------------------------------------- ...

  2. Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1573  Solv ...

  3. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 -- 分层图最短路

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MB Description 每天,农夫 ...

  4. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 优先队列+dij

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1768  Solv ...

  5. 分层图最短路 【bzoj1579】[Usaco2009 Feb]Revamping Trails 道路升级

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M< ...

  6. BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路

    BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...

  7. BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579 题意: 给你一个无向图,n个点,m条边,每条边有边权w[i]. 你可以将其中的k(k ...

  8. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra

    Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...

  9. BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路 + Dijkstra

    Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...

随机推荐

  1. 1. 用自己的算法实现startsWith和endsWith功能。

    package com.xinjian; public class Chazifu { public static void main(String[] args) { String a=" ...

  2. updating the chroot

    Ubuntu may stop working after a Chrome OS update. If that's the case, update all the installed targe ...

  3. replication factor

    http://www.tuicool.com/articles/RJbIBj 关于Hadoop中replication factor解惑 时间 2014-06-09 08:00:50   ITeye ...

  4. Python 模块功能paramiko SSH 远程执行及远程下载

    模块 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现 ...

  5. 【jsp 练习】 给定三角形三边判断是否能组成三角形及计算面积

    Test.java package package1; public class Test { double side1 = -1 , side2 = -1 , side3 = -1 , area = ...

  6. java socket解析和发送二进制报文工具(附java和C++转化问题)

    解析: 首先是读取字节: /** * 读取输入流中指定字节的长度 * <p/> * 输入流 * * @param length 指定长度 * @return 指定长度的字节数组 */ pu ...

  7. Jquery树控件ZTree异步加载

    异步加载的意思就是: 当点击展开树节点时,才去请求后台action返回点击节点的子节点数据并加载. 这里面主要设计ztree的setting变量的async属性设置: var setting = { ...

  8. Android OpenGL ES(三)OpenGL ES API 命名习惯 .

    OpenGL ES是个跨平台的3D图形开发包规范,最常见的实现是采用C语言实现的,Android OpenGL ES 实现上是使用Java 语言对底层的C接口进行了封装,因此在android.open ...

  9. OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试

    片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...

  10. UVA - 11732 "strcmp()" Anyone?左兄弟右儿子trie

    input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...