最小生成树之KRUSKAL

此程序之快速排序有点问题,请自行修改正确

#include<stdio.h>
#include<stdlib.h>
int e[1001][3],p[101],rank[101];
int m,n;
void qsort(int x,int y){
	int mid,l,r,k;
	l=x;r=y;
	mid=e[(x+y)/2][0];
	while(l<r){
		while(e[l][0]<mid && l<=r)l++;
		while(e[r][0]>mid && l<=r)r--;
		if(l<=r){
			k=e[l][0];e[l][0]=e[r][0];e[r][0]=k;
			k=e[l][1];e[l][1]=e[r][1];e[r][1]=k;
			k=e[l][2];e[l][2]=e[r][2];e[r][2]=k;
			l++;r--;
		}		
	}
	if(l<y)qsort(l,y);
	if(r>x)qsort(x,r);	
}

int find(int x){
	if(p[x]!=x)
		p[x]=find(p[x]);
	return p[x];
}

int query(int x,int y){
	if(find(x)==find(y))
		return 1;
	else
		return 0;
}

void link(int x,int y){
	if(rank[find(x)]>rank[find(y)]){
		p[find(y)]=find(x);
		rank[find(x)]++;
	}else{		
	    p[find(x)]=find(y);	
		rank[find(y)]++;
	}
}

int main(){
	int i,j,k,sum=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)p[i]=i;
	for(i=1;i<=m;i++)
		scanf("%d%d%d",&e[i][1],&e[i][2],&e[i][0]);
	//qsort(1,m);
	for(i=1;i<m;i++)
		for(j=i+1;j<=m;j++)
			if(e[i][0]>e[j][0]){
				k=e[i][0];e[i][0]=e[j][0];e[j][0]=k;
				k=e[i][1];e[i][1]=e[j][1];e[j][1]=k;
				k=e[i][2];e[i][2]=e[j][2];e[j][2]=k;
			}
	k=n;i=1;
	while(k!=1){
		if(!query(e[i][1],e[i][2])){
			link(e[i][1],e[i][2]);
			sum+=e[i][0];
			k--;
		}
		i++;
	}
	printf("%d\n",sum);
	system("pause");
	return 0;
}


你可能感兴趣的:(最小生成树之KRUSKAL)