上午上课之前做了一下最小生成树题目,本来想是用来练练手的,预计20分钟一定可以OK的,哪知道让我纠结了一上午啊。。。
这是一道很普通的ACM题目,没想到并查集数组定义出错了,原来设定的是从0开始的,可是题目中村子确实从1开始的,提交后出错了好多次都是数组越界,真是蛋疼啊。。。
又一次成功的栽在了初始化0和1的问题上面,也望过来人注意一下,要明确其对应关系。
# include<stdio.h>
# include<string.h>
int id[6000],eu[6000],ev[6000],ew[6000],p[101];
void init(int n,int m)
{
int i;
for(i=1;i<=n;i++)
p[i]=i;
for(i=0;i<m;i++)
id[i]=i;
}
int find(int x)
{
if(x!=p[x])
{
p[x]=find(p[x]);
}
return p[x];
}
int cmp(const void *a,const void *b)
{
int c,d;
c=*((int *)a);
d=*((int *)b);
return ew[c]-ew[d];
}
int kruskal(int n,int m)
{
int i,j,k,ret=0;
init(n,m);
qsort(id,m,sizeof(id[0]),cmp);
for(i=1,j=-1;i<n;i++)
{
while(k=id[++j],find(eu[k])==find(ev[k]));
ret+=ew[k];
p[find(eu[k])]=find(ev[k]);
}
return ret;
}
void main()
{
int n,m,i;
while(scanf("%d",&n)&&n)
{
m=n*(n-1)/2;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&eu[i],&ev[i],&ew[i]);
}
printf("%d\n",kruskal(n,m));
}
}