这里使用kruskal:
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
struct edge
{
int u, v, w;
edge() {}
edge(int _u, int _v, int _w) : u(_u), v(_v), w(_w) {}
bool operator <(const edge& rhs) const
{
return w > rhs.w;
}
};
int set[101];
int find(int x)
{
return set[x] < 0 ? x : set[x] = find(set[x]);
}
int main()
{
int n, i, u, v, w, ans;
while (scanf("%d", &n) != EOF && n)
{
priority_queue<edge> q;
memset(set, -1, sizeof set);
ans = 0;
for (i = 1; i <= n*(n-1)/2; ++i)
{
scanf("%d %d %d", &u, &v, &w);
q.push(edge(u, v, w));
}
while (!q.empty())
{
edge p = q.top(); q.pop();
u = find(p.u), v = find(p.v);
if (u != v)
{
set[u] += set[v];
set[v] = u;
ans += p.w;
if (set[u] == -n) break;
}
}
printf("%d\n", ans);
}
}