计算最小生成树的总长度,使用 Kruskal算法。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXR = 80;
int father[100]; //父结点
struct road //公路
{
int start; //起点
int end; //终点
int dis; //距离
}r[MAXR];
//排序条件
bool cmp(road r1, road r2)
{
return r1.dis < r2.dis;
}
//初始化并查集
void makeSet(int n)
{
for (int i = 'A'; i < 'A' + n; i++)
{
father[i] = i;
}
}
//查找x所在集合的代表元素(所在树的根结点)
int find(int x)
{
if (x != father[x])
father[x] = find(father[x]);
return father[x];
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0)
break;
makeSet(n);
char s, e; //起点,终点
int d; //距离
int k; //当前结点道路数量
int index = 0; //总路径数
for (int i = 1; i < n; i++) //将所有路径存入结构体数组
{
cin >> s >> k;
for (int j = 0; j < k; j++)
{
cin >> e >> d;
r[index].start = s;
r[index].end = e;
r[index].dis = d;
++index;
}
}
sort(r, r + index, cmp);
int sum = 0; //总距离
for (int i = 0; i < index; i++)
{
int fx = find(r[i].start);
int fy = find(r[i].end);
if (fx != fy)
{
father[fx] = fy;
sum += r[i].dis;
}
}
cout << sum << endl;
}
return 0;
}
继续加油。