这道题目做的时候,把cmp 函数的定义写到main 函数里了,结果一直编译不过,唉,真挫……
输入数据中既有字母又有数字,读入数据要细心些,注意空格、换行符。
#include<stdio.h>
#include<stdlib.h>
struct road
{
char fomer;
char latter;
int dis;
}e[75];
int find(char c,int *father)
{
int n;
n=c-'A';
if(father[n]==n)
return n;
else
return find(father[n]+'A',father);
}
void merge(int x,int y,int *father)
{
father[x]=y;
}
int cmp( const void *a ,const void *b) //晕!一直说函数cmp illegal,最后原因是:函数可以嵌套调用,但是不能嵌套定义!!!
{
return ((struct road *)a)->dis-((struct road *)b)->dis;
}
int main()
{
int n,i,t,j,A,B,father[26],count;
char m;
while(scanf("%d",&n),n!=0)
{
for(i=0;i<26;i++)
father[i]=i;
for(i=0,j=0;i<n-1;i++)
{
getchar();
m=getchar();
scanf("%d",&t);
while(t--)
{
getchar();
scanf("%c%d",&e[j].latter,&e[j].dis);
e[j].fomer=m;
j++;
}
}
//读入数据
//进行排序
qsort(e,j,sizeof(e[0]),cmp);
//遍历每一条边
for(i=0,count=0;i<j;i++)
{
A=find(e[i].fomer,father);
B=find(e[i].latter,father);
if(A!=B) //判断是否在同一集合
{
merge(A,B,father); //合并
count+=e[i].dis;
}
}
printf("%d\n",count);
}
return 0;
}