//11102903 c00h00g 1797 Accepted 4364K 407MS G++ 1481B 2012-12-12 22:30:50
//最短路径重新定义为:从1-n的一条路径中,最短的那条边的长度。然后求出所有最短边中的最大值
//只是贪心的策略改变了,每次查找最大的d进行松弛
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 999999999
//n交叉路口数,m边的个数
int n,m;
int mat[1005][1005];
int d[1005];
int vis[1005];
int N;
int main(){
scanf("%d",&N);
int cases=0;
while(N--){
cases++;
scanf("%d%d",&n,&m);
//初始化
memset(mat,-1,sizeof(mat));
memset(d,-1,sizeof(d));
memset(vis,0,sizeof(vis));
int a,b,w;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&w);
mat[a][b]=mat[b][a]=w;
}
//dijkstra i用来表示循环的次数
d[1]=INF;
vis[1]=true;
for(int i=2;i<=n;i++){
if(mat[1][i]!=-1){
d[i]=mat[1][i];
}
}
for(int i=0;i<n-2;i++){
int minF=-INF;
int v=0;
//查找最大值
for(int j=1;j<=n;j++){
if(vis[j]==0&&d[j]!=-1){
if(d[j]>minF){
minF=d[j];
v=j;
}
}
}
vis[v]=1;
for(int j=1;j<=n;j++){
if(vis[j]==0&&mat[v][j]!=-1&&d[j]<min(d[v],mat[v][j])){
d[j]=min(d[v],mat[v][j]);
}
}
}
printf("Scenario #%d:\n",cases);
printf("%d\n\n",d[n]);
}
return 0;
}
POJ 1797 最短路
最新推荐文章于 2019-08-01 16:30:00 发布