hdu 1213 How Many Tables

简单并查集,求出并查集的个数。一句话:尽信书,不如无书。凡事要自己思考。merge时都是把双方的根结点来merge。里面的函数均是正确的。

AC代码:

#include<stdio.h>
#include<string.h>

int n,m,res;
#define NUM 1005
int set[NUM];

int find(int x)
{
	return set[x];
}

void merge(int a, int b)
{
	int i,j,k,temp;
	i=find(a);
	j=find(b);
	if(i>j){
		temp=i;
		i=j;
		j=temp;
	}
	for(k=1;k<=n;k++){
		if(set[k]==j)
			set[k]=i;		
	}
}


int find1(int x)
{
	int r=x;
	while(set[r]!=r)
		r=set[r];
	return r;
}

void merge1(int a, int b)
{
	int x=find1(a);
	int y=find1(b);
	set[x]=y;

}


int main()
{
	int t,i,a,b;
	freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
	scanf("%d",&t);
	while(t--){
		scanf(" %d%d",&n,&m);
		res=n;
		for(i=0;i<=n;i++)
			set[i]=i;
		for(i=0;i<m;i++){
			scanf("%d%d",&a,&b);
			if(find1(a)!=find1(b)){
				merge1(a,b);
					res--;
			}
				
		}
		printf("%d\n",res);
		

	}
	return 0;

}


你可能感兴趣的:(hdu 1213 How Many Tables)