(P1111) 并查集 修复公路
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+5;
int dzx[N],siz[N];
int find (int x){
if(dzx[x]==x) return x;
else return dzx[x]=find(dzx[x]);
}
struct name{
int x,y,t;
}a[N];
bool cmp(name s,name t){
return s.t<t.t;//?
}
int n,m;
int main( ){
scanf("%d%d",&n,&m);
//int x,y,t;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
}
for(int i=1;i<=n;i++) dzx[i]=i,siz[i]=1;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
if(find(a[i].x)==find(a[i].y)) continue;
int q=dzx[a[i].x],w=dzx[a[i].y];
if(siz[q]<siz[w]) dzx[q]=w,siz[w]+=siz[q];
else dzx[w]=q,siz[q]+=siz[w];
if(siz[find(1)]==n){
printf("%d",a[i].t);
return 0;
}
}
puts("-1");
return 0;
}