题目大意:给出的图的结点是字母,每个点都可能有与之相连的边以及权值,求最小生成树。
思路:kruskal
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
const int maxn = 1111;
int fa[maxn];
int n, m;
struct node
{
int from, to;
int w;
bool operator < (const node &a)const
{
return w < a.w;
}
}p[maxn];
void init(int n)
{
for(int i=0; i<=n; i++)
{
fa[i] = i;
}
}
int find_fa(int x)
{
return fa[x] == x ? fa[x] : fa[x] = find_fa(fa[x]);
}
int kruskal(int num)
{
int ans = 0;
int cnt = 0;
for(int i=0; i<num; i++)
{
int fx = find_fa(p[i].from);
int fy = find_fa(p[i].to);
if(fx != fy)
{
fa[fx] = fy;
ans += p[i].w;
cnt++;
}
if(cnt == n-1)
break;
}
return ans;
}
int main()
{
while(scanf("%d", &n) && n)
{
init(n);
int num = 0;
char cfrom, cto;
int dis;
for(int i=0; i<n-1; i++)
{
cin >> cfrom >> m;
for(int j=0; j<m; j++)
{
p[num].from = cfrom - 'A';
cin >> cto >> dis;
p[num].to = cto - 'A';
p[num].w = dis;
num++;
}
}
sort(p, p + num);
int res = kruskal(num);
printf("%d\n", res);
}
return 0;
}