可以很明显的看出,这是一道求最小生成树的问题,使用Kruskal算法和并查集的技巧,可以轻松解决。
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
struct Node
{
int vil1;
int vil2;
int cost;
};
bool cmp (Node a,Node b)
{
return a.cost < b.cost;
}
int Tree[100];
int findRoot(int x)
{
if (Tree[x] == -1) return x;
return findRoot(Tree[x]);
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0) break;
n = n*(n-1)/2;
int a,b;
Node ss[100];
int sum = 0;
for (int i = 1;i <= n;i++)
{
Tree[i] = -1;
}
for (int i = 0;i < n;i++)
{
cin >> ss[i].vil1 >> ss[i].vil2 >> ss[i].cost;
}
sort(ss,ss+n,cmp);
for (int i = 0;i < n;i++)
{
a = findRoot(ss[i].vil1);
b = findRoot(ss[i].vil2);
if (a != b)
{
Tree[a] = b;
sum += ss[i].cost;
}
}
cout << sum << endl;
}
}