codevs1021 玛丽卡

题目描述 Description
麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。因为她和他们不住在同一个城市,因此她开始
准备她的长途旅行。在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另
一个城市路上所需花费的时间。麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清
楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。玛丽卡将
只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在
的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。编写程序,帮助麦克找出玛丽卡
按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。

输入描述 Input Description
第一行有两个用空格隔开的数N和M,分别表示城市的数量以及城市间道路的数量。
1≤N≤1000,1≤M≤N*(N-1)/2。城市用数字1至N标识,麦克在城市1中,玛丽卡在城市N中。

接下来的M行中每行包含三个用空格隔开的数A,B和V。其中1≤A,B≤N,1≤V≤1000。
这些数字表示在A和城市B中间有一条双行道,并且在V分钟内是就能通过。

输出描述 Output Description
输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够
到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克
处。

样例输入 Sample Input
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10

样例输出 Sample Output
27

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4.  
  5. int n,m;
  6. int cnt,start,end,ans;
  7. int head[],q[],dis[],p[];
  8. bool vis[];
  9. struct node{
  10. int u;
  11. int v;
  12. int w;
  13. int next;
  14. }s[];
  15.  
  16. void add(int x,int y,int z){//建边
  17. s[++cnt].u=x;
  18. s[cnt].v=y;
  19. s[cnt].w=z;
  20. s[cnt].next=head[y];
  21. head[y]=cnt;
  22. }
  23.  
  24. int main(){
  25. scanf("%d%d",&n,&m);
  26. for(int i=;i<=m;i++){
  27. int x,y,z;
  28. scanf("%d%d%d",&x,&y,&z);
  29. add(x,y,z);
  30. add(y,x,z);//无向图双向建边
  31. }
  32.  
  33. dis[]=;//1--1 dis=0
  34. vis[]=true;
  35. for(int i=;i<=n;i++) dis[i]=;
  36. q[++start]=;//1进队
  37. end++;
  38.  
  39. while(start<=end){//spfa
  40. for(int i=head[q[start]];i!=;i=s[i].next){
  41. if(dis[q[start]]+s[i].w<dis[s[i].u]){//松弛
  42. dis[s[i].u]=dis[q[start]]+s[i].w;
  43. p[s[i].u]=i;//记录路径
  44. if(vis[s[i].u]==false){//判断是否进队
  45. q[++end]=s[i].u;
  46. vis[s[i].u]=true;
  47. }
  48. }
  49. }
  50. vis[q[start++]]=false;//队首弹出
  51. }
  52.  
  53. ans=max(ans,dis[n]);//不删边的情况下最优解
  54.  
  55. int t=n,k;
  56. while(t!=){//枚举删除最优路径上那一条边
  57. k=s[p[t]].w;//删边记录删除路径 val
  58. s[p[t]].w=;//相当于删除
  59. if(p[t]&)s[p[t]+].w=;//双向建 双向删
  60. else s[p[t]-].w=;
  61. for(int i=;i<=n;i++){
  62. dis[i]=;
  63. vis[i]=false;
  64. }
  65. for(int i=;i<=end;i++)q[i]=;
  66. dis[]=;
  67. vis[]=true;
  68. start=;
  69. end=;
  70. q[start]=;
  71.  
  72. while(start<=end){//删一边 spfa
  73. for(int i=head[q[start]];i!=;i=s[i].next){
  74. if(dis[q[start]]+s[i].w<dis[s[i].u]){
  75. dis[s[i].u]=dis[q[start]]+s[i].w;
  76. if(vis[s[i].u]==false){
  77. q[++end]=s[i].u;
  78. vis[s[i].u]=true;
  79. }
  80. }
  81. }
  82. vis[q[start++]]=false;
  83. }
  84.  
  85. if(dis[n]!=)ans=max(ans,dis[n]);
  86. s[p[t]].w=k;//复原
  87. if(p[t]&)s[p[t]+].w=k;
  88. else s[p[t]-].w=k;
  89. t=s[p[t]].v;
  90. }
  91. printf("%d",ans);
  92. return ;
  93. }

#图# #SPFA# ----- codevs1021 玛丽卡的更多相关文章

  1. codevs1021 玛丽卡

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  2. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  3. 洛谷P1186 玛丽卡 spfa+删边

    洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...

  4. Spfa【p1186】 玛丽卡

    Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个 ...

  5. 习题:玛丽卡(SPFA)

    玛丽卡(wikioi1021) [题目描述 ]麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复.因为她和他们不住在同一个城市,因此她开始准备她的长途旅行.在这个国家中每两个城市之间最多只有一条路相通, ...

  6. P1186 玛丽卡

    题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...

  7. 洛谷——P1186 玛丽卡

    P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...

  8. luoguP1186 玛丽卡 x

    P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...

  9. Codevs 1021 (玛丽卡)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

随机推荐

  1. Codeforces Round #368 (Div. 2)D. Persistent Bookcase DFS

    题目链接:http://codeforces.com/contest/707/my 看了这位大神的详细分析,一下子明白了.链接:http://blog.csdn.net/queuelovestack/ ...

  2. 翻译的很好的一篇android mediaplayer

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于如何使用这个类的方法还可以阅读VideoView类的文档. 1.状态图对播放音频/视频文件和流的控制是通过一个状态机来管理的.下图显示一 ...

  3. Lua打印Table的数据结构工具类

    --这是quick中的工具,作用就是打印Lua中强大的table的结构, 当table的嵌套层级比较多的时候,这个工具非常方便,开发中必备的工具. --具体使用方法:local debug = req ...

  4. highcharts第一篇---简介和使用

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  5. Struts2---声明式异常处理

    在service方法里 throw抛出一个异常, 然后再方法声明上加上throws: public List<Category> list() throws SQLException{ C ...

  6. ARM架构解析

    ARM架构解析 (2014-11-23 21:56:53) 转载▼ 标签: francis_hao arm架构 arm核 soc 分类: MCU 先来谈一下ARM的发展史:1978年12月5日,物理学 ...

  7. ngx_http_core_module模块提供的变量

    ngx_http_core_module模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它nginx模块.在我们对请求做策略如改写等等都会使用到一些变量,顺便对ngx ...

  8. (简单) POJ 1062 昂贵的聘礼,Dijkstra。

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家 拿不出这么多金币,便请求酋长降 ...

  9. stm32 Bootloader设计(YModem协议) (转)

    源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...

  10. 一、Hadoop基本操作命令

    查看hadoop版本 hadoop version 启动与关闭 启动Hadoop 1.         进入HADOOP_HOME目录. 2.         执行sh bin/start-all.s ...