杭电 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;
}
米尔科无意中听到车里有一条路正在修理,它被堵住了,但不知道到底是哪条路。它可能来自马西娅的城市米尔科的无论哪一条路是封闭的。
玛丽卡只会用非阻塞的道路旅行,她会以最短路径旅行。米尔科想知道要花多少时间她会在最坏的情况下,他的城市,所以他可以让他的女朋友外出的时间够长的了。写一个程序,帮助米尔科找到分钟可能需要玛丽卡来通过最短路径非封锁道路他的城市时间最长的是什么。
#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;
}
相关文章推荐
- HDU 1595 find the longest of the shortest
- HDOJ 1595 find the longest of the shortest (枚举最短路+删除)
- hdu 1595 find the longest of the shortest (dijkstra)
- HDOJ 题目1595 find the longest of the shortest(枚举,最短路记录路径)
- find the longest of the shortest HDU1595
- HDU 1595 find the longest of the shortest 删除一条边的最长最短路
- hdu 1595 find the longest of the shortest(spfa)(存储并枚举最短路径的边)
- hdu 1595 find the longest of the shortest(spfa)(存储并枚举最短路径的边)
- hdu 1595 find the longest of the shortest(dijstra + 枚举)
- 【HDU】1595 find the longest of the shortest 枚举+最短路
- HDOJ1595 find the longest of the shortest 最短路+枚举
- HDU 1595——find the longest of the shortest
- HDU - 1595 find the longest of the shortest(最短路Dijkstra+枚举删边)
- hdu 1595 find the longest of the shortest
- HDU 1595 find the longest of the shortest 【枚举删边 + 最短路】
- hdu 1595 find the longest of the shortest(spfa)(存储并枚举最短路径的边)
- hdu 1595 find the longest of the shortest(spfa)(存储并枚举最短路径的边)
- HDU 1595 find the longest of the shortest (Dijkstra)
- HDU-1595-find the longest of the shortest
- HDU 1595 find the longest of the shortest