题意:
一条通路上的承重定义为这条通路上经过的所有路径承重的最小值,要去求从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;
}