洛谷 P1186 玛丽卡
来源:互联网 发布:淘宝客服售后问题 编辑:程序博客网 时间:2024/05/21 01:53
题目描述
麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。
因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。
在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。
麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。
玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。
编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。
输入输出格式
输入格式:
第一行有两个用空格隔开的数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分钟内是就能通过。
输出格式:
输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。
输入输出样例
输入样例#1:
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
输出样例#1:
27
#include <cstdio>#include <iostream>#include <queue>#include <cmath>#include <cstring>#define N 1000001#define inf 1000000009using namespace std;int n,m;int head[N];int nex[N];int to[N];int v[N];bool vis[10001];int dis[1005];int pre[1000005];int from[N];int tot;inline void add(int x,int y,int z){ ++tot; nex[tot]=head[x]; head[x]=tot; to[tot]=y; v[tot]=z; from[tot]=x;}inline void spfa1(int u){ for(int i=1;i<=n;i++) dis[i]=1<<31-1;; memset(vis,0,sizeof(vis)); queue<int> q; q.push(u); vis[u]=true; dis[u]=0; while(!q.empty()){ int dmf=q.front(); q.pop(); for(int i=head[dmf];i;i=nex[i]){ int hxr=to[i]; if(dis[hxr]>dis[dmf]+v[i]){ dis[hxr]=dis[dmf]+v[i]; pre[hxr]=i; if(!vis[hxr]){ vis[hxr]=true; q.push(hxr); } } } vis[dmf]=0; }}bool vis2[10001];int dis2[1005];inline void spfa2(int u){ for(int i=1;i<=n;i++) dis2[i]=1<<31-1;; memset(vis2,0,sizeof(vis)); queue<int> q; vis2[1]=true; dis2[1]=0; q.push(u); while(!q.empty()){ int dmf=q.front(); q.pop(); for(int i=head[dmf];i;i=nex[i]){ int hxr=to[i]; if(dis2[hxr]>dis2[dmf]+v[i]){ dis2[hxr]=dis2[dmf]+v[i]; if(!vis2[hxr]){ vis2[hxr]=true; q.push(hxr); } } } vis2[dmf]=0; }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } spfa1(1); int ans=dis[n]; for(int i=pre[n];i;i=pre[from[i]]){ int tem=v[i]; v[i]=99999999; spfa2(1); v[i]=tem; ans=max(ans,dis2[n]); } printf("%d",ans); return 0;}
阅读全文
0 0
- 洛谷 P1186 玛丽卡
- 洛谷 P1186 玛丽卡
- 洛谷 P1186 玛丽卡
- 洛谷 P1186 玛丽卡
- 洛谷 P1186 玛丽卡
- 玛丽卡 (codevs p1021;洛谷p1186)
- 【洛谷 P1186】玛丽卡 spfa+删边
- P1186 玛丽卡
- Codevs 1021 玛丽卡==洛谷 P1186
- 【题解】P1186玛丽卡(最短路+图论+SPFA+SLF优化)
- luogu解题报告:P1186玛丽卡【图论/最短路/堆优化dijkstra】
- 洛谷1186 玛丽卡
- 洛谷1186-玛丽卡
- 【洛谷 1186】 玛丽卡
- 洛谷1186 玛丽卡
- 玛丽卡
- 玛丽卡
- 玛丽卡
- 关于SVD的应用详解
- 图像腐蚀,模糊,canny边缘检测,opencv中摄像头捕捉的图像
- [POJ 3310][树的直径]Caterpillar
- CSS实现三角形
- mac环境下搭建hexo+github pages+next个人博客
- 洛谷 P1186 玛丽卡
- 使用Wamp在win7上搭WEB服务器
- 笔记-git与github的交互初识
- 六级_第二天
- 回溯法输出字符串入栈出栈的全部可能序列
- 【opencv学习笔记.1】操作像素画圆
- 委托、泛型委托等
- Uva1395 Slim Span(最小生成树)
- 栈—— 表达式转换