最小生成树找瓶颈边
#include <cstdio>
#include <algorithm>
const int MAXN = 1e5 + 2;
const int MAXM = 2e5 + 2;
struct Edge {
int a, b, w;
bool operator < (const Edge &a) const { return w < a.w; }
} edge[MAXM];
struct Union_Find {
int dad[MAXN];
int n;
void init() {
for (int i = 1; i <= n; i++)
dad[i] = i;
}
Union_Find(int n) {
this->n = n;
init();
}
int find(int x) {
if (dad[x] != x) dad[x] = find(dad[x]);
return dad[x];
}
void merge(int x, int y) {
dad[find(x)] = find(y);
}
bool judge(int x, int y) {
return find(x) == find(y);
}
};
int n, m;
int main()
{
scanf("%d %d", &n, &m);
Union_Find u(n);
for (int i = 1; i <= m; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
edge[i].a = a; edge[i].b = b; edge[i].w = c;
}
std::sort(edge + 1, edge + 1 + m);
int cnt = 0;
for (int i = 1; i <= m; i++) {
if (!u.judge(edge[i].a, edge[i].b)) {
cnt++;
u.merge(edge[i].a, edge[i].b);
}
if (u.judge(1, n)) {
printf("%d\n", edge[i].w);
return 0;
}
}
return 0;
}