洛谷 P1396 营救(最小生成树)
传送门
解题思路
两种方法:
-
方法一:
直接按照Kruskal的方法求最小生成树,求的过程中s和t刚刚联通时加的边的大小即为答案。 -
方法二:
先二分答案,然后跑一遍最短路,要求只能走边权小于二分值的边。
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=2e4+5;
int n,m,s,t,fa[maxn],ans;
struct node{
int u,v,w;
}e[maxn];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>s>>t;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
q.push(make_pair(e[i].w,i));
}
while(find(s)!=find(t)){
ans=q.top().first;
int id=q.top().second;
if(find(e[id].u)!=find(e[id].v)){
fa[fa[e[id].u]]=fa[e[id].v];
}
q.pop();
}
cout<<ans;
return 0;
}