AcWing 240. 食物链
原题链接
中等
作者:
minux
,
2020-04-24 16:45:09
,
所有人可见
,
阅读 561
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int FA[N], D[N];
int n, m;
// 并查集操作
int Find(int x){
if(x!=FA[x]){
int t=Find(FA[x]);
D[x]+=D[FA[x]]; // 更新节点到根节点的距离
FA[x]=t;
}
return FA[x];
}
void Union(int x, int y){
int fx=Find(x);
int fy=Find(y);
if(fx != fy){
FA[fx]=fy;
}
}
// 维护并查集加入额外信息
// 每个节点到该点属于集合root的距离
int main(){
memset(FA, 0x00, sizeof FA);
memset(D, 0x00, sizeof D);
cin>>n>>m;
for(int i=1; i<=n; ++i){
FA[i]=i;
}
int res=0;
while(m--){
int type, x, y;
cin>>type>>x>>y;
if(x>n||y>n) res++;
else{
int fx=Find(x);
int fy=Find(y);
if(type==1){
// 同类判断
if(fx==fy && (D[x]-D[y])%3) res++;
else if(fx != fy){
FA[fx]=fy;
D[fx]=D[y]-D[x];
}
}
else if(type==2){
// 判断捕食关系
if(fx==fy && (D[x]-D[y]-1)%3) res++;
else if(fx != fy){
FA[fx]=fy;
D[fx]=D[y]-D[x]+1;
}
}
}
}
cout<<res<<endl;
return 0;
}