问题链接:Problem J
问题简述:
有n个城镇,m个道路,每条道路都有其最大承重量。让你选择一条路径,能承载最多的货物,输出能运输的最大重量。
问题分析:
这题的原理和上一题I题的原理是一模一样的。只不过这题将要求的目标反了过来,变为了先求出每条路径的最小权值边,再比较每条路径的最小权值边,找出最大权值的那一条。但是数据量增加到了1000,Floyd算法显然行不通了,只好乖乖的去学Djkstra了(帽子大大出题居心叵测)。原理与Floyd类似,先从顶点1出发,寻找出最小权值的边,在扩散时比较得出最大的一条。
AC通过的C++语言程序如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
#include<iomanip>
#define N 0x3f3f3f3f
using namespace std;
int map[1005][1005];
int d[1005];
bool vis[1005];
int n,m;
void dij(){
for(int i=1;i<=n;i++){
d[i]=max(d[i],map[1][i]);
}
vis[1]=1;
for(int i=1;i<n;i++){
int m=0;
int tmp;
for(int j=1;j<=n;j++){
if(!vis[j]&&m<d[j]){
m=max(m,d[j]);
tmp=j;
}
}
vis[tmp]=1;
for(int j=1;j<=n;j++){
if(!vis[j]&&d[j]<min(map[tmp][j],d[tmp]))
d[j]=min(map[tmp][j],d[tmp]);
}
}
}
int main(){
int cnt=0;
int t;
cin>>t;
while(t--){
cin>>n>>m;
cnt++;
int a,b,c;
memset(map,0,sizeof(map));
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
map[a][b]=map[b][a]=c;
}
dij();
printf("Scenario #%d:\n",cnt);
cout<<d[n]<<endl;
cout<<endl;
}
}