20分 #1#3AC
查看原帖
20分 #1#3AC
480934
_LiMLE_楼主2021/10/4 15:21
#include<bits/stdc++.h>

using namespace std;

int fa[3000001],val[3000001];

int n,m;

struct sj
{
	int x,y;
};

sj a[100001];

void init()
{
	for(int i=1;i<=2*n;i++) 
	{
		fa[i]=i;
		val[i]=0;
	}
	return;
}

int findn(int x)
{
	if(fa[x]==x) return x;
	else return fa[x]=findn(fa[x]);
}

void merge(int x,int y)
{
	int fx=findn(x),fy=findn(y);
	fa[fx]=fy;
	return;
}

int main()
{
	cin>>n>>m;
	init();
	long long cnt=0;
	for(int i=1;i<=m;i++)
	{
		int op,x,y;
		cin>>op>>x>>y;
		if(x>n||y>n) 
		{
			cnt++;
			continue;
		}
		int fx=findn(x),fy=findn(y),fx2=findn(x+n),fy2=findn(y+n),fx3=findn(x+2*n),fy3=findn(y+2*n);
		if(op==1)
		{
			if(fx==fy2||fx2==fy) 
			{
				cnt++;
				continue;
			}
			else 
			{
				merge(fx,fy);
				merge(fx2,fy2);
				merge(fx3,fy3);
			}
		}
		else if(op==2)
		{
			if(fx==fy|| fx==fy2)
			{
				cnt++;
				continue;
			}
			else
			{
				merge(x,y+2*n);
				merge(y,x+n);
			}
		}
	}
	cout<<cnt<<endl;
	return 0;
}

拓展域并查集,求调

2021/10/4 15:21
加载中...