1 solutions
-
0
C++ :
#include<bits/stdc++.h> using namespace std; int l=INT_MAX,r=INT_MIN,n,m,s,t,ans; //cost:记录拥挤度 int f[20010],x[20010],y[20010],cost[20010]; //查找 int find(int x){ return x == f[x]?x:f[x]=find(f[x]); } //二分函数,看拥挤度在mid的情况下从s到t是否有通路 bool check(int mid){ for(int i = 1;i <= n;i++) f[i] = i;//初始化 //m条路 for(int i = 1;i <= m;i++){ //代价大于mid的通路无效 if(cost[i] > mid) continue; int fx = find(x[i]),fy = find(y[i]); //将x[i]和y[i]合并到同一个集合 if(fx != fy){ f[fx] = fy; } } //如果s到t有通路 if(find(s) == find(t)) return true; else return false; } int main(){ cin>>n>>m>>s>>t; //读入m条路的拥挤度 for(int i = 1;i <= m;i++){ cin>>x[i]>>y[i]>>cost[i]; l = min(l,cost[i]); r = max(r,cost[i]); } //二分拥挤度,找左边界 int mid; while(l <= r){ mid = (l + r) >> 1; //如果在拥挤度为mid的情况下有通路,尝试降低mid if(check(mid)){ r = mid - 1; }else{ l = mid + 1; } } //输出左边界 cout<<l; return 0; }
- 1
Information
- ID
- 9965
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By