N个点,M条边,每条边有权值。求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。
Input
多组输入,第一行给一个T。
每一组第一行给两个数n和m。(1 <= n <= 1000)
接下来m行,每行三个数u,v,w代表路径的两个端点与边权。
(1 <= u,v <= n , 0< w <= 1e6)
保证两点间只有一条边,该图为无向图。
Output
第i组数据先输出 “Scenario #i:”
然后输出该路径上的最小边权。
保证有解
Sample Input
1
3 3
1 2 3
1 3 4
2 3 5
Sample Output
Scenario #1:
4
思路:找最短路径,并且最短路径中边权最小值最大,这是一道套最短路径算法的模板题,有些改动。直接看代码吧:
注意:输出的时候要多次换行,提交的时候一直卡在输出格式错误。
在这里插入代码片
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n,m;
int e[1005][1005];
int dist[1005];
int vst[1005];
void bigboom()
{
for(int i=1; i<=n; i++)
{
dist[i]=e[i][1];
}
vst[1]=1;
for(int i=1; i<n; i++)
{
int g=0;
int h;
for(int j=1; j<=n; j++)
{
if(vst[j]==0&&dist[j]>g)
{
g=dist[j];
h=j;
}
}
vst[h]=1;
if(h==n)
{
break;
}
for(int k=1; k<=n; k++)
{
if(vst[k]==0&&dist[k]<min(dist[h],e[k][h]))
{
dist[k]=min(dist[h],e[k][h]);
}
}
}
printf("%d\n\n",dist[n]);//坑点,需要多次换行
}
int main()
{
int T,t=0;
scanf("%d",&T);
while(T--)
{
t++;
scanf("%d%d",&n,&m);
memset(e,0,sizeof(e));
memset(vst,0,sizeof(vst));
memset(dist,0,sizeof(dist));
int u,v,w;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
if(e[u][v]<w)
{
e[u][v]=e[v][u]=w;
}
}
printf("Scenario #%d:\n",t);
bigboom();
}
return 0;
}