poj 2492简单带权并查集

#include 
#include 
using namespace std;
const int M =10100000;
int par[M],Rank[M],n; // rank[x] =1 x和父结点为异性  
void Inin()
{
	for(int i=1;i<=n;i++)
	{
		par[i]=i;
		Rank[i]=0;
	}
}
int find(int x)
{
	if(x!=par[x])
	{
		int t=par[x];
		par[x]=find(par[x]);
		Rank[x]=(Rank[x]+Rank[t])%2; //	
	}
	return par[x];
}
void Union(int x,int y,int d)
{
	int fx=find(x);
	int fy=find(y);
	
	par[fx]=fy;
	//fx->fy?   fx->x->y->fy
	Rank[fx]=(2-Rank[x]+d+Rank[y])%2;
	
}
int main()
{
	int t,k;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		int flag=1;
		
		cin>>n>>k;
		Inin();
		while(k--)
		{
		
			int x,y;
			scanf("%d%d",&x,&y);
			
			int rx=find(x);
			int ry=find(y);
			
			if(rx==ry) //同一集合中可以判断 
			{
				// x-> root ->y  的 x->y  
			
				if((Rank[x]+2-Rank[y])%2==0)
				{
					flag=0;
					continue;
				}
									
			}					
			else // 不是同一集合 则两者当前没关系 可以合并 
			{
				Union(x,y,1);
		
			}
		}
		printf("Scenario #%d:\n",i);
		if(flag)
		{
			printf("No suspicious bugs found!\n\n");
		}
		else
		{
			printf("Suspicious bugs found!\n\n");
		}
	
	}
	return 0;
}


 
 

你可能感兴趣的:(Data,Structure)