题目链接:传送门biubiubiu~~
分析:自己感觉有点奇妙,做了POJ2253-Frogger(最短路变形)这道题后,感觉莫名奇妙,这道题就扫了一遍代码就一遍过了。。(难道是传说中的题感还是这题有点水),感觉自己都没理解透就A过去了。。。 题意大概是,把承重量当两条路之间的权值,找到从起始点到终点的(各条路径中最小值的那段)中的最大值,即max(min(可行路径边)),然后只要套上模板然后把dis[ ]当作到达某点的可行路径最小值中最大的那个(有点绕口)就行了。。。
(对了,输入用cin会超时。。。)
AC代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdio>
using namespace std;
int n,m;
int map[1005][1005];
bool vis[1005];
int dis[1005];
const int INF=100000000;
void spfa(int s){
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++) dis[i]=0;//所有初始为0才能在松弛操作中被替代掉
queue<int> que;
vis[s]=true;
dis[s]=INF; //初始值要无穷大才能被代替掉,否则数据一直是0
que.push(s);
while(!que.empty()){
int now=que.front();
que.pop();
vis[now]=false;
for(int i=1;i<=n;i++){
if(min(dis[now],map[now][i])>dis[i]){ //判断条件这里即为找出每条可行路径的最小值
dis[i]=min(dis[now],map[now][i]);//同时是所有中最大的
if(!vis[i]){
que.push(i);
vis[i]=true;
}
}
}
}
}
int main(){
int t,ans=0;
cin>>t;
while(t--){
cin>>n>>m;
ans++;
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
spfa(1);
cout<<"Scenario #"<<ans<<":"<<endl;
cout<<dis[n]<<endl<<endl;
}
}