POJ 1797 最短路
来源:互联网 发布:淘宝上的组装机怎么样 编辑:程序博客网 时间:2024/05/07 01:43
//11102903c00h00g1797Accepted4364K407MSG++1481B2012-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;}