最小生成樹。kruscal算法
#include<stdio.h>
#include<algorithm>
using namespace std;
int root[101];
int N, Q, i, j, a, b, d, t, ans;
struct road
{
int s;
int e;
int d;
} edge[5051];
bool cmp(road a, road b)
{
return a.d < b.d;
}
int find(int a)
{
while(a != root[a])
a = root[a];
return a;
}
void merge(int a, int b)
{
a = find(a);
b = find(b);
if(a != b)
root[b] = a;
}
int main()
{
while(scanf("%d", &N) == 1 && N)
{
for(i = 1; i < 101; i++)
root[i] = i;
t = 0;
int m = N*(N-1)/2;
for(i = 1; i <= m; i++)
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
edge[t].s = a;
edge[t].e = b;
edge[t].d = c;
t++;
}
sort(edge, edge+t, cmp);
ans = 0;
for(i = 0; i < t; i++)
{
if(find(edge[i].s) != find(edge[i].e))
{
merge(edge[i].s,edge[i].e);
ans += edge[i].d;
}
}
printf("%d\n", ans);
}
}