#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100000000
int n, f[27], m;
struct road
{
int a, b, dis;
}r[80];
int find(int x)
{
if(x != f[x])
f[x] = find(f[x]);
return f[x];
}
int merge(int x, int y)
{
x = find(x);
y = find(y);
if(x != y)
{
f[x] = y;
return 1;
}
return 0;
}
int cmp(const void *a, const void *b)
{
return (*(struct road*)a).dis - (*(struct road*)b).dis;
}
int main()
{
int i, j, k;
while(scanf("%d", &n) != EOF && n)
{
getchar();
char s;
m = 0;
for(i = 0; i < n-1; ++i)//input
{
scanf("%c %d", &s, &k);
getchar();
if(k > 0)
{
char c;
for(j = 0; j < k; ++j)
{
int num;
scanf("%c %d", &c, &num);
getchar();
r[m].a = s-65;
r[m].b = c-65;
r[m++].dis = num;
}
}
}
for(i = 0; i < n; ++i)
f[i] = i;
qsort(r, m, sizeof(r[0]), cmp);
int ans = 0;
j = 0;
for(i = 0; i < m; ++i)
{
if(merge(r[i].a, r[i].b) == 1)
{
j++;
ans += r[i].dis;
if(j == n-1)
break;
}
}
printf("%d\n", ans);
}
return 0;
}
题意:给出n个城市,接下来n行每一行对应该城市所能连接的城市的个数,城市的编号以及花费,现在求能连通整个城市所需要的最小花费。
思路:算是标准的最小生成树,只要处理好字母输入和数据的保存就可以按照标准的模板进行a题。