再做食物链【扩展并查集】

这题很明显总共有三种关系:

1、x与y同类

2、x吃y

3、y吃x

所以这时候,如果只有一个域就不能表示这3种关系了,比如将(x,y)合并,那么这时候是x,y哪种关系呢? 所以这时候我们就要将这一个点扩展为3个点。 同类域,吃域,被吃域。

具体看代码吧:

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 50001;
int pre[N*3];
void init(int n)
{
	for(int i=0;i<=n*3;i++)
	{
		pre[i]=i;
	}
}
int find(int x)
{
	if(x==pre[x]) return x;
	else
	return pre[x]=find(pre[x]);
}
void Union(int x,int y)
{
	int rootx = find(x);
	int rooty = find(y);
	if(rootx!=rooty)
	{
		pre[rootx]=rooty;
	}
	return ;
}
int main()
{
	int n,k,x,y,op,ans;
	cin>>n>>k;
	
		ans=0;
		init(n);
		for(int i=0;i<k;i++)
		{
			cin>>op>>x>>y;
			if(x>n||y>n)
			{
				ans++;
				continue;
			}
			if(op==1)
			{
				if(find(x+n)==find(y) || find(x)==find(y+n))
				{
					ans++;
				}
				else{
					Union(x,y);
					Union(x+n,y+n);
					Union(x+2*n,y+2*n);
				}
			}
			if(op==2)
			{
				if(x==y)
				{
					ans++; continue;
				}
				if(find(x)==find(y)||find(y)==find(x+n))
				{
					ans++;
				}
				else{
					Union(x,y+n);
					Union(x+n,y+n+n);
					Union(x+2*n,y);
				}
			}
		}
		cout<<ans<<endl;
	
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_40816078/article/details/84203238
今日推荐