赤裸裸的并差集,需要增加 2 * N 个空间 错放 这种动物的 食物和天敌,唯一被卡的地方就数据 输入数据是单组,看成多组用EOF结尾判WA。。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXD 50000
int fa[ 3 * MAXD + 10];
int N,K;
int find_father(int u){
return u == fa[u] ? u : fa[u] = find_father(fa[u]);
}
int solve(){
int ans = 0;
for(int i = 0; i < 3 * N ; i++) fa[i] = i;
for(int i = 0; i < K ; i++){
int x,y,z;
scanf("%d%d%d",&z,&x,&y);
if(x <= 0 || x > N || y <= 0 || y > N) ans ++;
else if(z == 1){ /*是同类*/
x-- ;y--;
int a1 = find_father(x);
int b1 = find_father(y);
int a2 = find_father(x + N);
int b2 = find_father(y + N);
int a3 = find_father(x + 2 * N);
int b3 = find_father(y + 2 * N);
if(a1 == b2 || a1 == b3)
ans ++;
else {
fa[a1] = b1;
fa[a2] = b2;
fa[a3] = b3;
}
}
else if(z == 2){
x-- ;y --;
int a1 = find_father(x); /*同类*/
int b1 = find_father(y);
int a2 = find_father(x + N); /*找他的天敌*/
int b2 = find_father(y + N);
int a3 = find_father(x + 2 * N);/*找他的食物*/
int b3 = find_father(y + 2 * N);
if(a1 == b1 || a1 == b3) /*如果是同类或者a是b的食物*/
ans ++;
else {
fa[a1] = b2;
fa[a2] = b3;
fa[a3] = b1;
}
}
}
return ans;
}
int main(){
scanf("%d%d",&N,&K);
int ans = solve();
printf("%d\n",ans);
return 0;
}