营救 - 洛谷https://www.luogu.com.cn/problem/P1396错题
题解:
直接进行Kruskal
将边从小到大排序后
进行合并操作,
不需要考虑前面的这些边是否会经过
因为若当前s到t不连通,则s到t一定有一条更长的边会覆盖当前的最大权值。
#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,s,t;
const int N=1e5+10;
struct node
{
int a,b,c;
}e[N];
bool com(node a,node b)
{
return a.c<b.c;
}
int p[N];
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
//freopen("uva.txt","r",stdin);
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
e[i]={a,b,c};
}
sort(e+1,e+m+1,com);
for(int i=1;i<=n;i++) p[i]=i;
int ans=0;
for(int i=1;i<=m;i++)
{
int a=find(e[i].a),b=find(e[i].b);
if(a!=b)
{
p[a]=b;
if(find(s)==find(b))
{
ans=max(ans,e[i].c);
}
if(find(s)==find(t))
{
printf("%d",ans);
break;
}
}
}
return 0;
}