传送门
http://acm.hdu.edu.cn/showproblem.php?pid=1233
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct Edge {
public:
int u;
int v;
int dis;
Edge(){}
Edge(int _u,int _v,int _dis) {
u = _u;
v = _v;
dis = _dis;
}
};
class UnionFind {
private:
int * fa;
int size;
public:
UnionFind(int n) {
size = n;
fa = new int[n+1];
Init();
}
~UnionFind() {
delete[] fa;
}
void Init() {
for(int i = 1 ; i <= size ; i ++) {
fa[i] = i;
}
}
int Find(int x) {
if(fa[x] != x) {
fa[x] = Find(fa[x]);
}
return fa[x];
}
bool Union(int x,int y) {
int fx = Find(x);
int fy = Find(y);
if(fx != fy) {
fa[fx] = fy;
return true;
}
else {
return false;
}
}
int GetCount() {
int count = 0;
for(int i = 1 ; i <= size ; i ++) {
if(fa[i] == i) {
count ++;
}
}
return count;
}
int GetMaxSetNum() {
int maxSetNum = 0;
int * countSet = new int[size+1];
memset(countSet,0,sizeof(int)*(size+1));
for(int i = 1 ; i <= size ; i ++) {
int fi = Find(i);
countSet[fi] ++;
}
for(int i = 1 ; i <= size ; i ++) {
if(countSet[i] > maxSetNum) {
maxSetNum = countSet[i];
}
}
delete[] countSet;
return maxSetNum;
}
};
bool cmp(Edge e1,Edge e2) {
return e1.dis < e2.dis;
}
class Kruskal {
private:
int edgeCnt;
UnionFind * puf;
Edge * edge;
public:
Kruskal(int nodeNum,int edgeNum) {
edgeCnt = 0;
puf = new UnionFind(nodeNum);
edge = new Edge[edgeNum];
}
~Kruskal() {
delete[] edge;
}
void AddEdge(int u,int v,int dis) {
edge[edgeCnt].u = u;
edge[edgeCnt].v = v;
edge[edgeCnt].dis = dis;
edgeCnt ++;
}
int Run() {
sort(edge,edge+edgeCnt,cmp);
int ret = 0;
for(int i = 0 ; i < edgeCnt ; i ++) {
if(true == puf->Union(edge[i].u,edge[i].v)) {
ret += edge[i].dis;
}
}
return ret;
}
};
int main(void) {
int n;
while(scanf("%d",&n) == 1 && n > 0) {
int m = n * (n - 1) / 2;
Kruskal mst(n,m);
for(int i = 0 ; i < m ; i++) {
int u,v,dis;
scanf("%d %d %d",&u,&v,&dis);
mst.AddEdge(u,v,dis);
}
printf("%d\n",mst.Run());
}
return 0;
}