题意:找一条路从 1 到 n , 这条路上的最小权值为这条路的权值,找一条路使权值最大。
题解:Dijkstra求最短路的修改,每次找距离 1 点边权最大的点,位置记录在pos上,每加入一个新点,更新dis , 进入更新的条件是,g[pos][j]>dis[j],在这之后好要保证dis[pos]>dis[j] , 不理解的话,结合题意画一个三角形。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define maxn 1115
const int inf = 0x3f3f3f3f;
int dis[maxn];
int g[maxn][maxn];
bool vis[maxn];
int n,m;
void Dijkstra(int n)
{
memset(vis,0,sizeof(vis));
for(int i = 1 ; i<= n ; i++)
{
dis[i] = g[1][i];
}
vis[1] = true;
for(int i = 1 ; i < n ; i++)
{
int maxx = 0;
int pos;
for(int j = 1 ; j <= n ; j++)
{
if(dis[j]>maxx&&!vis[j])
{
pos = j;
maxx = dis[j];
}
}
vis[pos] = true;
for(int j = 1 ; j<= n; j++)
{
if(dis[j]<g[pos][j])
dis[j] = max(dis[j],min(dis[pos],g[pos][j]));
}
}
return;
}
int main()
{
int t,n,m;
scanf("%d",&t);
for(int l = 1 ; l <= t; l++)
{
scanf("%d%d",&n,&m);
memset(g,0,sizeof(g));
for(int i = 0 ; i <m ;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c>0)
g[a][b] = g[b][a] = c;
}
Dijkstra(n);
printf("Scenario #%d:\n",l);
printf("%d\n\n",dis[n]);
}
return 0;
}