這道題目做的時候,把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;
}