题目来源:https://vjudge.net/problem/POJ-1797
【题意】
从点1到点n,很多条路径,每条路径都有一个最小的权值,求这些最小的权值里的最大值。
【思路】
这道题和我做的的上一题差不多一样的做法(自行点击)。均是维护d数组就可以了,只不过稍微有些变化而已,做这种题的关键是理解。
【代码】
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int w[1010][1010];
int d[1010];
bool vis[1010];
int n,m;
void djs()
{
for(int i=1; i<=n; i++)
{
d[i]=w[1][i];
vis[i]=0;
}
for(int i=1; i<=n; i++)
{
int m=-1;
int x=-1;
for(int j=1; j<=n; j++)
if(!vis[j]&&d[j]>m)
m=d[x=j];
if(x!=-1)
{
vis[x]=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&d[j]<min(d[x],w[x][j]))
d[j]=min(d[x],w[x][j]);//维护d数组
}
}
}
int main()
{
int T,t=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
w[i][j]=i==j?0:-1;
for(int i=1; i<=m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(w[x][y]<z)
w[x][y]=w[y][x]=z;
}
djs();
printf("Scenario #%d:\n%d\n\n",t++,d[n]);
}
}