hdu 1233

来源:互联网 发布:去除ghost预装软件 编辑:程序博客网 时间:2024/06/05 18:42

上午上课之前做了一下最小生成树题目,本来想是用来练练手的,预计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));}}