洛谷P1396 营救

  1. 题目

题目传送门

  1. 思路

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

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

  1. 代码

二话不说,我们先上代码

点击查看代码
#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;
}
  1. 小妙招

做题一定不要死磕一道题目,不会就看题解,看也不要抄,一定要自己打一遍(这是我的第一篇题解呦!!!)

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