题意:
一条通路上的承重定义为这条通路上经过的所有路径承重的最小值,要去求从1到N的所有通路中的最大承重
dijstra
每次收录最大承重的点
更新条件为、
dist[i] = max( dist[i], min( Max, G[MaxV][i] ) );
#include <iostream> #include <memory.h> #include <string> #include <stdio.h> #include <algorithm> #include <math.h> #define IN (1<<28) using namespace std; int N, kase, M; int G[1010][1010], dist[100005], visited[100005];//dist[i]是所有通路中的最大 void Dij() { for( int i = 1; i <= N; i++ ) dist[i] = G[1][i]; visited[1] = 1; for( int cnt = 1; cnt < N; cnt++ ) { int MaxV = 0, Max = 0; for( int i = 1; i <= N; i++ ) { if( !visited[i] && dist[i] > Max ) { MaxV = i; Max = dist[i]; } } if( !MaxV ) break; visited[MaxV] = 1; for( int i = 1; i <= N; i++ ) { if( !visited[i] ) { dist[i] = max( dist[i], min( Max, G[MaxV][i] ) ); } } } } void OutPut( int num ) { printf("Scenario #%d:\n", num); printf("%d\n\n", dist[N]); } int main() { scanf("%d", &kase); for( int k = 1; k <= kase; k++ ) { scanf("%d %d", &N, &M); memset(G, 0, sizeof(G)); memset(dist, 0, sizeof(dist)); memset(visited, 0, sizeof(visited)); for( int i = 1; i <= N; i++ ) for( int j = 1; j <= N; j++ ) { if( i==j ) G[i][j] = IN; else G[i][j] = 0; } while( M-- ) { int src,des,len; scanf("%d %d %d", &src, &des, &len); G[src][des] = len; G[des][src] = len; } Dij(); OutPut(k); } return 0; }