- 题解
食物链
- @ 2026-8-3 10:41:48
#include<bits/stdc++.h>
using namespace std;
const int maxn=300010;
int n,k;
int father[maxn];
int size[maxn];
int find(int x){
if(father[x]==x)return x;
return father[x]=find(father[x]);
}
void merge(int x,int y){
int rootx=find(x),rooty=find(y);
if(rootx!=rooty){
father[rootx]=rooty;
size[rooty]+=size[rootx];
}
}
int main(){
cin>>n>>k;
int cnt=0;
for(int i=1;i<=3*n;i++){
father[i]=i;
}
for(int i=1;i<=k;i++){
int op,x,y;
cin>>op>>x>>y;
if(x>n||y>n){
cnt++;
continue;
}
int x_self=x,x_enemy=x+n,x_food=x+n+n;
int y_self=y,y_enemy=y+n,y_food=y+n+n;
if(op==1){
if(find(x_self)==find(y_food)||find(x_food)==find(y_self)){
cnt++;
}else{
merge(x_self,y_self);
merge(x_food,y_food);
merge(x_enemy,y_enemy);
}
}else if(op==2){
if(find(x_self)==find(y_self)||find(x_self)==find(y_food)){
cnt++;
}else{
merge(x_self,y_enemy);
merge(x_food,y_self);
merge(x_enemy,y_food);
}
}
}
cout<<cnt;
return 0;
}
1 条评论
-
周铭浚 钻石 Lv.初识 @ 2026-8-3 10:42:08一楼
- 1