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[1010],q[30050],dis[1010],p[1000010];
 8 bool vis[1010];
 9 struct node{
10     int u;
11     int v;
12     int w;
13     int next;
14 }s[1000010];
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=1;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]=0;//1--1  dis=0
34     vis[1]=true;
35     for(int i=2;i<=n;i++) dis[i]=999999999;
36     q[++start]=1;//1进队
37     end++;
38
39     while(start<=end){//spfa
40         for(int i=head[q[start]];i!=0;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!=0){//枚举删除最优路径上那一条边
57         k=s[p[t]].w;//删边记录删除路径 val
58         s[p[t]].w=999999999;//相当于删除
59         if(p[t]&1)s[p[t]+1].w=999999999;//双向建 双向删
60         else s[p[t]-1].w=999999999;
61         for(int i=2;i<=n;i++){
62             dis[i]=999999999;
63             vis[i]=false;
64         }
65         for(int i=2;i<=end;i++)q[i]=0;
66         dis[1]=0;
67         vis[1]=true;
68         start=1;
69         end=1;
70         q[start]=1;
71
72         while(start<=end){//删一边  spfa
73              for(int i=head[q[start]];i!=0;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]!=999999999)ans=max(ans,dis[n]);
86         s[p[t]].w=k;//复原
87         if(p[t]&1)s[p[t]+1].w=k;
88         else s[p[t]-1].w=k;
89         t=s[p[t]].v;
90     }
91     printf("%d",ans);
92     return 0;
93 }

转载于:https://www.cnblogs.com/wjting/p/6023444.html

#图# #SPFA# ----- codevs1021 玛丽卡相关推荐

  1. Codevs 1021 玛丽卡

    Codevs 1021 玛丽卡 题目地址:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他 ...

  2. 玛丽卡(codevs 1021)

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

  3. 【codevs1021】玛丽卡,以前屯着的最短路

    传送门 写在前面:以前屯着的一个最短路,感觉有点恶心o_O 思路:最初用的堆优化dijskra+邻接矩阵,结果T了3组,就放在那里了.现在捡起来用了SPFA+邻接表枚举所有边,T了2组,然后想到先求出 ...

  4. 【洛谷P1186】玛丽卡(断边+最短路)

    传送门 这个题意描述的狗屁不通...其实大概就是 1-n有m条边但m条边中可能会有一条边无法通过求出时间t,保证时间t内无论哪条路无法通过,都能满足有一条从1-n路径总时间小于或等于t的最短路 然后思 ...

  5. 中国商业贝恩玛丽酒店行业市场供需与战略研究报告

    商业贝恩玛丽酒店市场的企业竞争态势 该报告涉及的主要国际市场参与者有Electrolux.Middleby.ITW.Welbilt.Scholl-Gastro.E&R Moffat.Hatco ...

  6. python例程:玛丽冒险

    目录 <玛丽冒险>程序使用说明 开发环境要求 运行方法 主要代码展示 源码及说明文档下载路径 <玛丽冒险>程序使用说明 在PyCharm中运行<玛丽冒险>即可进入如 ...

  7. 基于Python的《玛丽冒险》小游戏

    开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 8.Windows 10. Python版本:Python 3.7.0. 开发工具:PyCharm. ...

  8. 恩斯特•施图林格(Ernst Stuhlinger)博士 给 玛丽•尤肯达(Mary Jucunda)修女 的回信

    这是网上流传的文章,不解释,看文章. 1970年,赞比亚修女玛丽·尤肯达(Mary Jucunda)给恩斯特·施图林格(Ernst Stuhlinger)博士写了一封信.施图林格因在火星之旅工程中的原 ...

  9. 第一位女性商业程序员玛丽库姆斯去世,享年 93 岁!

    作者 | 张洁 出品 | 程序人生 (ID:coder _life) 据 The Register 报道,2 月 28 日,世界上首位使用商业应用编写计算机程序的女性.英国知名女程序员玛丽·库姆斯(M ...

  10. CF-346 D. Robot Control(反向建图spfa)

    CF-346 D. Robot Control(反向建图spfa) 题目链接 题意 有向图(有环)中有一个机器人,机器人有三种规则: 重复访问同一个点会自我销毁 无路可走会自我销毁 多岔路口会随机选择 ...

最新文章

  1. linespace 自动生成线性向量的API
  2. 最新的GAN方法——PGGAN揭秘
  3. NTU 课程: MAS714(3) DFS BFS(搜索算法)
  4. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
  5. C#操作IIS6创建网站应用程序无效
  6. 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!
  7. 现在小餐厅的推广视频
  8. Anders Hejlsberg谈C#、Java和C++中的泛型
  9. 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
  10. 微信订阅号如何快速涨粉
  11. HDUOJ 1847 Good Luck in CET-4 Everybody!
  12. 国内对公转账银行手续费的几种情形
  13. 禁止文件夹 icloud_如何更改Windows iCloud照片文件夹位置
  14. RSPapers | 对话推荐系统论文合集
  15. 兰州理工大学计算机专业课,兰州理工大学计算机专业复试科目
  16. Java服务器、android连接小票打印机打印(亲测可用)
  17. VMware Workstation安装ubuntu虚拟机如何进行显示器分屏扩展?
  18. An error has occurred. See error log for more details. com.android.ddmlib.IDevice.getName()Ljava/lan
  19. mac使用Homebrew安装node
  20. 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(一)

热门文章

  1. 进程间通信-命名管道FIFO
  2. qt控制程序打开记事本_Qt 记事本程序
  3. 【天梯选拔月赛】参与者人数(并查集模版题!remember find_father写法!)
  4. 【持续更新】最小生成树题目集合
  5. mysql 关闭严格_mysql关闭严格模式
  6. 产生随机数(rand()函数和srand()函数)的含义
  7. response Headers与request Headers字段详解(收藏)
  8. ML for trading -cs7646-01
  9. 算法:回文数字9. Palindrome Number
  10. 基于近邻法的分类器设计