您的位置:首页 > Web前端 > JavaScript

杭电 1595 find the longest of the shortest Dijstra

2017-05-16 11:55 295 查看

玛丽卡很生米尔科的气因为他找到了一个新的女朋友,她寻求报复。因为她不住在同一个城市,她开始准备长途旅行。我们知道每路多少分钟来从一个城市到另一个。

米尔科无意中听到车里有一条路正在修理,它被堵住了,但不知道到底是哪条路。它可能来自马西娅的城市米尔科的无论哪一条路是封闭的。
玛丽卡只会用非阻塞的道路旅行,她会以最短路径旅行。米尔科想知道要花多少时间她会在最坏的情况下,他的城市,所以他可以让他的女朋友外出的时间够长的了。写一个程序,帮助米尔科找到分钟可能需要玛丽卡来通过最短路径非封锁道路他的城市时间最长的是什么。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define PI acos(-1.0)
#define INF 0x3fffffff
//typedef long long LL;
//typedef __int64 LL;
#define MAXN 1017
int mat[MAXN][MAXN];
int n, m;
int re[MAXN];//记录路径
void init()
{
for(int i = 0; i <= n; i++)
{
re[i] = 0;
for(int j = 0 ; j <= n; j++)
{
if(i == j)
mat[i][j] = 0;
else
mat[i][j] = INF;
}
}
}

int dijkstra (int f)
{
int dis[MAXN];//记录到任意点的最短距离
int mark[MAXN];//记录被选中的结点
int i,j,k = 0;
for(i = 0 ; i <= n ; i++)//初始化所有结点,每个结点都没有被选中
mark[i] = 0;
for(i = 0 ; i <= n ; i++)
{
dis[i] = INF;
}
// mark[1] = 1;
dis[1] = 0;//start为1
int min ;//设置最短的距离。
for(i = 1 ; i <= n; i++)
{
min = INF;
for(j = 1 ; j <= n;j++)
{
if(mark[j] == 0 && dis[j] < min)//未被选中的结点中,距离最短的被选中
{
min = dis[j] ;
k = j;
}
}
mark[k] = 1;//标记为被选中
for(j = 1 ; j <= n ; j++)
{
if( mark[j] == 0 && (dis[j] > (dis[k] + mat[k][j])))//修改剩余结点的最短距离
{
dis[j] = dis[k] + mat[k][j];
if(f)
re[j] = k;
}
}
}
return dis
;
}

int main()
{
int i, j;
int a, b, v;
while(~scanf("%d%d",&n,&m))
{
init();
for(i = 0; i < m; i++)
{
scanf("%d%d%d",&a,&b,&v);
if(v < mat[a][b])
{
mat[a][b] = mat[b][a] = v;
}
}
int ans = dijkstra(1);
for(i = n; i != 1; i = re[i])
{
int t = mat[i][re[i]];
mat[i][re[i]] = INF;
mat[re[i]][i] = INF;
int tt = dijkstra(0);//从0开始为了re[]不再记录路径
if( ans < tt)
ans = tt;
mat[i][re[i]] = t;
mat[re[i]][i] = t;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: