做题记录整理并查集3 P2024 [NOI2001] 食物链(2022/9/16)
种类并查集
说实话这题做的时候看了题解也没整明白,最后是直接跟着题解打了一遍。。。。
现在再来看看
......
经过一小时的研究,搞懂了这个种类并查集,具体看这里。
#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
int fa[500005],gx[500005];  //0-->同种动物,1-->捕食关系,2-->被捕食关系。
int n,m,a,b,p,ans=0;
int find(int a) {
	int ji=fa[a];
	if (a==ji) return ji;
	fa[a]=find(ji);
	gx[a]=(gx[a]+gx[ji])%3;
	return fa[a];
}
int main() {
	cin>>n>>m;
	for1(i,1,n) fa[i]=i,gx[i]=0;
	for1(i,1,m) {
		cin>>p>>a>>b;
		if ((a>n||b>n)||(p==2&&a==b)) {   //特判
			ans++;
			continue;
		}
		if (p==1) { //同类
			int faa=find(a),fab=find(b);
			if (faa==fab&&gx[a]!=gx[b]) {
				ans++;
				continue;
			} else if(faa!=fab) {
				fa[faa]=fab;
				gx[faa]=(3-gx[a]+gx[b])%3;
			}
		}
		else { //吃与被吃
			int faa=find(a),fab=find(b);
			if (faa==fab) {
				int gxla=(gx[a]-gx[b]+3)%3;
				if (gxla!=1) {
					ans++;
					continue;
				}
			} else {
				int faa=find(a),fab=find(b);
				fa[faa]=fab;
				gx[faa]=(3-gx[a]+gx[b]+1)%3;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号