1 solutions

  • 0
    @ 2025-3-3 16:21:27

    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