#include<iostream>#include<string>#include<cmath>#include<ctype.h>#include<memory.h>#include<string.h>#include<algorithm>#include<map>#include<iomanip>#include<set>#include<list>#include<vector>#include<stack>#include<queue>#define ll long long intusingnamespace std;constint maxn =1010;int T;int Map[maxn][maxn];intmain(){
cin >> T;for(int ii =1; ii <= T; ii++){memset(Map,0,sizeof(Map));int n, m;
cin >> n >> m;for(int i =1; i <= m; i++){int u, v, w;
cin >> u >> v >> w;
Map[u][v]= Map[v][u]= w;}for(int k =1; k <= n; k++)for(int i =1; i <= n; i++)for(int j =1; j <= n; j++)
Map[i][j]=max(Map[i][j],min(Map[i][k], Map[k][j]));printf("Scenario #%d:\n", ii);printf("%d\n", Map[1][n]);}return0;}
法二:Dijkstra,AC!由于题目输入数据的原因,所以下标从1开始
#include<iostream>#include<string>#include<cmath>#include<ctype.h>#include<memory.h>#include<string.h>#include<algorithm>#include<map>#include<iomanip>#include<set>#include<list>#include<vector>#include<stack>#include<queue>#define ll long long intusingnamespace std;constint maxn =1010;constint INF =0x3f3f3f3f;int T;int n, m;int Map[maxn][maxn];int dis[maxn];int vis[maxn];voiddijkstra(int s){for(int i =1; i <= n; i++)
dis[i]= Map[i][s];memset(vis,0,sizeof(vis));
vis[s]=1;for(int i =1; i <= n; i++){int Max =0, max_pos =-1;for(int j =1; j <= n; j++)if(Max < dis[j]&&!vis[j]){
Max = dis[j];
max_pos = j;}if(max_pos !=-1)
vis[max_pos]=1;for(int k =1; k <= n; k++)if(!vis[k])
dis[k]=max(dis[k],min(dis[max_pos], Map[max_pos][k]));}}intmain(){
cin >> T;for(int ii =1; ii <= T; ii++){
cin >> n >> m;for(int i =1; i <= n; i++)for(int j =1; j <= n; j++)
Map[i][j]=0;//要求最小边的最大值(最大值),所以初始化为0.//但是如果要求最大边的最小值(最小值),则写为:Map[i][j] = i == j ? 0 : INF;for(int i =1; i <= m; i++){int u, v, w;
cin >> u >> v >> w;
Map[u][v]= Map[v][u]= w;}dijkstra(1);printf("Scenario #%d:\n", ii);printf("%d\n\n", dis[n]);}return0;}