Kruskal算法比Prim更好写
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 110
#define maxm 10010
using namespace std;
int n;//点的个数
int m;//边的个数
int uf[maxn];
struct edg
{
int from;
int to;
int cost;
}e[maxm];
bool cmp(const edg &x, const edg &y) {
return x.cost<y.cost;
}
void init()
{
for (int i = 0; i < maxn; i++)uf[i] = i;
}
int find(int x) {
if (x == uf[x])return x;
return uf[x] = find(uf[x]);
}
int Union(int x, int y) {//合并两个集合(如果x,y在同一集合,返回0,否则返回1)
x = find(x), y = find(y);
if (x != y) {
uf[x] = y;
return 1;
}
return 0;
}
int Kruskal(int n, int m) {//n个点,m条边
sort(e, e + m, cmp);//排序
int sum = 0;//最小生成树的权值和
for (int i = 0; i<m; i++) {//从小到大枚举边
int from = e[i].from, to = e[i].to, cost = e[i].cost;
sum += cost*Union(from, to);
}
return sum;//返回权值和
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
init();
if (n == 0)break;
m = 0;
for (int i = 0; i < n - 1; i++)
{
char from[4],to[4];
int times,cost;
scanf("%s%d", &from, ×);
while (times--)
{
scanf("%s%d", &to, &cost);
e[m].cost = cost;
e[m].from = from[0] - 'A';
e[m++].to = to[0] - 'A';
}
}
printf("%d\n", Kruskal(n, m));
}
return 0;
}