洛谷P1396 营救

题目

题目传送门

思路

这道题用的是最小生成树,我用的是Kruskal算法,当然也可以用Prim算法(但是俺不会。。。)

我们可以一边先输入,然后排序,然后跑一下最小生成树,然后如果s区的根和t区的根一样,我们就停止程序
(因为我们事先排序了,所以我们碰到的最后一个一定是最大的最大拥堵值)

代码

二话不说,我们先上代码

#include<bits/stdc++.h>//万能头文件
using namespace std;
int n,m,fa[50100],ok,ans,j,s,t;
int find(int x){//查找
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
struct kk{
    int x,y,z;
}a[200010];
bool cmp(kk r,kk l){
    return r.z<l.z;
}
int main(){
    cin>>n>>m>>s>>t;
    for(int i=1;i<=n;i++)
        fa[i]=i;//初始化
    for(int i=1;i<=m;i++)
        cin>>a[i].x>>a[i].y>>a[i].z;
    sort(a+1,a+m+1,cmp);//排序
    int f=0;
    for(int i=1;i<=m;i++){//核心代码
        int f1=find(a[i].x);
        int f2=find(a[i].y);
        if(f1!=f2){
            fa[f1]=f2;
         
            ok++;
            //ans+=a[i].z;调试
        }
        if(find(s)==find(t)){//如果联通直接输出退出
        	cout<<a[i].z;
        	return 0; 
		}
    }
    
    return 0;
}
// 这是我的第一篇题解,给点赞吧QWQ

点个赞吧,亲

posted @ 2025-07-06 23:01  陈晨2011  阅读(34)  评论(0)    收藏  举报