社区讨论

求助带权并查集

P2024[NOI2001] 食物链参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@louxy701
此快照首次捕获于
2023/11/12 11:53
2 年前
此快照最后确认于
2023/11/12 14:10
2 年前
查看原帖
rt,经典30pts.
w[u] 为 u 节点相对于其父亲的关系,0 同类,1 被吃,2 吃。
CPP
#include<bits/stdc++.h>
using namespace std;

const int maxn=5e4+10;

const int mod=3;

int fa[maxn],w[maxn];

int Find(int u) {
	if(fa[u]) {
		fa[u]=Find(fa[u]);
		w[u]=(w[fa[u]]+w[u]+mod)%mod;
		return fa[u];
	}
	return u;
}

void Merge(int u,int v,int c) {
	int fu=Find(u),fv=Find(v);
	fa[fu]=fv;
	w[u]=c;
}

int main() {
	int n,T,cnt=0;
	cin>>n>>T;
	while(T--) {
		int op,u,v,f=1;
		cin>>op>>u>>v;
		if(u>n||v>n||(op==2&&u==v)) {	
			cnt++;
			f=0;
			continue;
		}else 
		if(op==1) {
			if(Find(u)==Find(v)&&w[u]!=w[v]) {
				cnt++;
				f=0;
			}else if(Find(u)!=Find(v)) {
				Merge(Find(v),Find(u),(w[u]-w[v]+mod)%mod);
			}
		}else {
			if(Find(u)==Find(v)) {
				if(w[u]!=(w[v]-1+mod)%mod) {
					cnt++;
					f=0;
				}
			}else {
				Merge(Find(v),Find(u),(w[u]-w[v]+1+mod)%mod);
			}
		}
//		cout<<(f?"T\n":"F\n");
	}
	cout<<cnt;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...