救命,30分
查看原帖
救命,30分
347832
tony_wind楼主2021/8/11 21:09

看了看题解,感觉一样啊


代码:


#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1; 

int f[3*N],n,m;
int ans;
int find(int x){return f[x]==x?x:(f[x]=find(f[x]));}

void un_1(int x,int y)
{
	f[x]=y;
	f[find(x+n)]=find(y+n);
	f[find(x+2*n)]=find(y+2*n);
	return ;
}

void un_2(int x,int y)
{
	f[find(x)]=find(y+2*n);
	f[find(x+n)]=find(y);
	f[find(y+2*n)]=find(x);
	
	return ;
}
int c,x,y;
int main()
{
	cin>>n>>m;
	for (int i = 1; i <= n*3; i++)f[i] = i; 
	while(m--){
		
		cin>>c>>x>>y;
		
		if( x>n || y>n ){
			ans++;
			continue;
		}
		
		if(c==1){
			if(find(x+n) == find(y) || find(x) == find(y+n))ans++;
			else un_1(x,y);
		}
		else {
			if(x == y)ans++;
			else if(find(x) == find(y)||find(x) == find(y+n)) ans++;
			else un_2(x,y);
		}
	}
	cout<<ans<<endl;
    return 0;
}
2021/8/11 21:09
加载中...