蒟蒻求助T_T
查看原帖
蒟蒻求助T_T
663949
HYLW楼主2024/3/6 22:07
#include<bits/stdc++.h>
/*

设置p[]表示节点的父节点,d[]表示节点与父节点的关系 

对于d[], 
用1表示节点吃根节点,2表示根节点吃节点,0表示节点与
根节点为同类。

则在同一集合中,节点x,y的关系表示为(d[x]+d[y])%3

合并节点x,y所在的集合,则
p[fx]=fy,d[fx]=abs(d[x]-d[y]-t)%3 
 
伪代码:
1.)循环输入x,y,1时e为0,2时e为1
2.)当x,y在同一个集合中,x与y的关系表示为
E=(d[x]+d[y])%3,若e!=E记为假话,
3.)当x,y不在一个集合中,则合并两个集合 

*/
using namespace std;
const int N = 5e4+10;
int n,k;
int p[N],d[N];

int find(int x){
	if(p[x]!=x){
		int root=find(p[x]);
		d[x]=(d[x]+d[p[x]])%3;
		p[x]=root;
	}
	return p[x];
} 

int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n+5;i++)	p[i]=i;
	
	int ans=0;
	while(k--){
		int e,x,y;
		scanf("%d%d%d",&e,&x,&y);
		e--;
		
		if(x>n || y>n || (x==y && e==1)){
			ans++;
			continue;
		}
		
		int fx=find(x),fy=find(y);
		
		if(fx==fy){
			if((d[x]-d[y]+3)%3!=e){
				ans++;
				continue;
			}
		}else{
			p[fx]=fy;
			d[fx]=(abs(d[x]-d[y]-e)%3+3)%3;
		}
	}
	
	printf("%d",ans);
	return 0;
} 
2024/3/6 22:07
加载中...