题意
传送门 POJ 2395
裸的最小生成树,这里更新的是最小树中的最大权边。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define INF 0x3f3f3f3f
#define delta 0.85
#define eps 1e-3
#define PI 3.14159265358979323846
#define MAX_V 2005
#define MAX_E 10005
using namespace std;
int V, E;
/**** Union_find ****/
int par[MAX_V], rank[MAX_V];
void init_union_find(int n){
for(int i = 0; i < n; i++){
par[i] = i, rank[i] = 0;
}
}
int find(int x){
if(par[x] == x) return x;
return par[x] = find(par[x]);
}
bool same(int x, int y){
return find(x) == find(y);
}
void unite(int x, int y){
x = find(x), y = find(y);
if(x == y) return;
if(rank[x] > rank[y]) par[y] = x;
else{
par[x] = y;
if(rank[x] == rank[y]) ++rank[y];
}
}
/**** Union_find ****/
/**** Kruskal ****/
struct edge{
int u, v, cost;
}es[MAX_E];
bool cmp(const edge& e1, const edge& e2){
return e1.cost < e2.cost;
}
int kruskal(){
sort(es, es + E, cmp);
init_union_find(V);
int res = 0;
for(int i = 0; i < E; i++){
edge &e = es[i];
if(!same(e.u, e.v)){
res = max(res, e.cost);
unite(e.u, e.v);
}
}
return res;
}
/**** Kruskal ****/
int main(){
while(~scanf("%d%d", &V, &E)){
for(int i = 0; i < E; i++){
int a, b, l;
scanf("%d%d%d", &a, &b, &l);
es[i].u = a, es[i].v = b, es[i].cost = l;
}
printf("%d\n", kruskal());
}
return 0;
}