题目链接:https://vjudge.net/problem/11758/origin
题目大意:n点m条边, 求1到n所有通路的最小边的最大值。
思路:与上一题类似:不过每次是找到有效集的最大边进行更新。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <functional>
#include <map>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
using namespace std;
//dis存储1到其他顶点的最小距离
//vis存储有效集
int e[1005][1005], dis[1005];
int vis[1005], n, m;
const int inf=1000000000;
void dijkstra()
{
for(int i=1;i<n;i++)
{
int m=-1;
int u;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]>m&&dis[i]!=-1)
{
m=dis[i], u=i;
}
}
vis[u]=1;
//对新加入点进行松弛操作
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]<min(e[u][i], dis[u]))
{
dis[i]=min(e[u][i], dis[u]);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
int cut=1;
while(t--)
{
scanf("%d%d",&n,&m);
memset(vis, 0, sizeof(vis));
for(int i=1;i<=1001;i++)
{
for(int j=1;j<=1001;j++)
{
if(i==j)
{
e[i][j]=0;
}
else
{
e[i][j]=-1;
}
}
}
for(int i=1;i<=m;i++)
{
int a, b, c;
scanf("%d%d%d",&a, &b, &c);
e[a][b]=c;
e[b][a]=c;
}
for(int i=1;i<=1001;i++)
{
dis[i]=e[1][i];
}
dijkstra();
printf("Scenario #%d:\n",cut);
printf("%d\n\n",dis[n]);
cut++;
}
return 0;
}