刷题日记--并查集

并查集

#include
using namespace std;
int pre[1000100],sum[30001]={
     0},s[30001]={
     0};

int search(int root)
{
     
	int son, tmp;
	son = root;
	while(root!=pre[root])
		root = pre[root];
	while(son!=root)
	{
     
		tmp=pre[son];
		pre[son]=root;
		son=tmp;
	}
	return root;
}
void join(int root1, int root2)  
{
       
    int x, y;  
    x = search(root1);
    y = search(root2); 
    if(x != y)   
        pre[x] = y; 
}  
int main()
{
     
	int n,m,i,j,k,total,t,a,b,root1,root2;
	scanf("%d %d",&n,&m);
	total=n;
	for(i=1;i<=n;i++)
		pre[i]=i;
	while(m--)
	{
     
		scanf("%d",&t);
		for(i=0;i<t;i++)
		{
     
			if(i==0)
				scanf("%d",&a);
			if(i!=0)
			{
     
				scanf("%d",&b);
				join(a,b);
			}	
		}
//		for(i=1;i<=t;i++)
//		{
     
//			scanf("%d",&s[i]);
//		}
//		for(i=1;i<=t;i++)
//			for(j=1;j<=t;j++)
//			{
     
//				
//					root1=search(s[i]);
//					root2=search(s[j]);
//					if(root1!=root2)
//					{
     
//						pre[root1]=root2;
//						total--;
//					}
//				
//			}
	}
	int max=0;
	for(i=1;i<=n;i++)
		sum[search(i)]++;
	for(i=1;i<=n;i++)
		cout<<pre[i]<<' ';
	for(i=1;i<=n;i++)	
		if(max<sum[i])
			max=sum[i];
	printf("%d",max);
	return 0;
}
#include
#include
#include
using namespace std;
int pre[1010000];

int search(int root)
{
     
	int son, tmp;
	son = root;
	while(root!=pre[root])
		root = pre[root];
	while(son!=root)
	{
     
		tmp=pre[son];
		pre[son]=root;
		son=tmp;
	}
	return root;
}
int main()
{
     
	int num,road,total,i,start,end,root1,root2,m,n,t;
	scanf("%d%d%d",&m,&n,&t);
	total=m*n;
	for(i=1;i<=m*n;i++)
		pre[i]=i;
	while(t--)
	{
     
		scanf("%d%d",&start,&end);
		root1=search(start);
		root2=search(end);
		if(root1!=root2)
		{
     
			pre[root1]=root2;
			total--;
		}
	}
	printf("%d\n",total);
	return 0;
}

你可能感兴趣的:(算法技能,c算法)