代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e4 + 10;
const int M = 1e5 + 10;
int n, m;
int par[N], ranks[N];
struct edge{
int fr, to, time;
}e[M];
bool cmp(const edge & a, const edge & b){
return a.time < b.time;
}
void init(int n){
for (register int i = 1; i <= n; ++i) {
par[i] = i;
ranks[i] = 1;
}
}
int find(int x){
return x == par[x] ? x : (par[x] = find(par[x]));
}
bool same(int x, int y){
return find(x) == find(y);
}
void unit(int i, int j){
int x = find(i), y = find(j);
if (ranks[x] <= ranks[y])
par[x] = y;
else
par[y] = x;
if (ranks[x] == ranks[y] && x != y)
++ranks[y];
}
int main() {
scanf("%d%d", &n, &m);
for (register int i = 1; i <= m; ++i) {
scanf("%d%d%d", &e[i].fr, &e[i].to, &e[i].time);
}
init(n);
sort(e + 1, e + 1 + m, cmp);
int count = 0;
for (register int i = 1; i <= m; ++i) {
int u = e[i].fr, v = e[i].to;
if (!same(u, v)){
unit(u, v);
++count;
}
if (count == n - 1){
printf("%d\n", e[i].time);
return 0;
}
}
printf("-1\n");
return 0;
}