首先对权值进行排序;
再结合敌人的敌人和自己在一个监狱的规律合并。
当查找时发现其中两个罪犯不可避免地碰撞到一起时,只能将其输出并结束。
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
int f[40040];
struct node{
int u;
int v;
int w;
}e[100010];
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
bool cmp(node a,node b){
return a.w>b.w;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n*2;++i){
f[i]=i;
}
for(int i=1;i<=m;++i){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m+1;++i){
int x=e[i].u;
int y=e[i].v;
if(find(x)==find(y)){
cout<<e[i].w;
break;
}else{
f[find(x+n)]=find(y);
f[find(y+n)]=find(x);
}
}
return 0;
}