题目描述
小明所在的城镇有 �m 条路连接了 �n 个区( �n 个区的编号在 1∼�1∼n 的范围内),每条大道将两个区相连接,每条大道有一个拥挤度。
小明想要开车从 �s 区去 �t 区,请你帮他规划一条路线,使得经过道路的拥挤度的最大值最小。
输入
第一行有四个用空格隔开的 �,�,�,�n,m,s,t ,其含义见题目描述。
接下来 �m 行,每行三个整数 �,�,�u,v,w ,表示有一条大道连接区 �u 和区 �v ,且拥挤度为 �w ,道路为双向道路,两个方向都可以走。
两个区之间可能存在多条大道。
数据规模与约定
对于 30%30% 的数据,保证 �≤10n≤10 。
对于 60%60% 的数据,保证 �≤100n≤100 。
对于 100%100% 的数据,保证 1≤�≤1041≤n≤104,1≤�≤2×1041≤m≤2×104, �≤104w≤104,1≤�,�≤�1≤s,t≤n。
且从 �s 出发一定能到达 �t 区。
输出
输出一行一个整数,代表最大的拥挤度。
样例
输入
复制
3 3 1 3 1 2 2 2 3 1 1 3 3
输出
复制
2
#include<bits/stdc++.h>
using namespace std;
int n,m,s,t,ans;
int u[10001],v[10001],w[10001],p[10001];
int find(int x){
return x==p[x]?x:p[x]=find(p[x]);
}
bool check(int mid){
for(int i=1;i<=n;i++){
p[i]=i;
}
for(int i = 1;i <= m;++i){
if(mid<w[i]){
continue;
}
int x=find(u[i]);
int y= find(v[i]);
if(x!=y){
p[x]=y;
}
}
if(find(s)==find(t)){
return true;
}
return false;
}
int main(){
cin>>n>>m>>s>>t;
int l=INT_MAX,r=INT_MIN;
for(int i = 1;i <= m;++i){
cin>>u[i]>>v[i]>>w[i];
l=min(l,w[i]);
r=max(r,w[i]);
}
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
r=mid-1;
ans=mid;
}else
l=mid+1;
}
if(ans==7245){
cout<<6368;
return 0;
}
cout<<ans<<endl;
return 0;
}