题意:翻译来自scy
Description
T组数据。每组数据有n个点m条双向边,问从1到n的路径上的最小的边最大是多少。
如数据1中路径1->2->3的最小边为3,1->3的最小边为4,取最大值为4
Input
第一行是数据组数T
第二行为n(1 <= n <= 1000)、m
接下来m行,每行是u,v,c,代表u、v之间有一条边权为c的双向边c<=1000000
Output
每个样例第一行输出"Scenario #i:",i为第几组数据。
接下来输出1到n的路径上的最小的边最大值
每组数据输出后输出一个空行
Sample Input
1
3 3
1 2 3
1 3 4
2 3 5
Sample Output
Scenario #1:
4
做法其实十分类似SPFA(简直一模一样),只是d数组定义改为出发点到点i的最小边的最大值。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int N=1100,INF=(int)1e6;
int n,m,len;
int first[N],d[N];
bool vis[N];
struct node{
int x,y,d,next;
}a[N*N];
void ins(int x,int y,int t)
{
len++;
a[len].x=x;a[len].y=y;a[len].d=t;
a[len].next=first[x];first[x]=len;
}
int main()
{
int T,i,j;
scanf("%d",&T);
for(int TT=1;TT<=T;TT++)
{
printf("Scenario #%d:\n",TT);
scanf("%d%d",&n,&m);
len=0;
memset(first,0,sizeof(first));
for(i=1;i<=m;i++)
{
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
ins(x,y,t);
ins(y,x,t);
}
d[1]=INF;
for(i=2;i<=n;i++) d[i]=0;
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(1);
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=1;
for(i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(min(d[x],a[i].d)>d[y])
{
d[y]=min(d[x],a[i].d);
if(!vis[y])
{
vis[y]=1;
q.push(y);
}
}
}
vis[x]=0;
}
printf("%d\n",d[n]);
printf("\n");
}
}