有没有不用3n数组,只开三个表示同类,吃,被吃的数组的方法?我的码只有三十分,还请诸位大佬指出谬误。
#include <bits/stdc++.h>
using namespace std;
int t[50001];
int e[50001];
int b[50001];
int find(int k){
if(t[k]==k)return k;
return t[k]=find(t[k]);
}
int n,k;
int z,x,y;
int ans;
int main(void){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)t[i]=i;
for(int i=1;i<=k;i++){
scanf("%d%d%d",&z,&x,&y);
if(x>n||y>n){
ans++;
continue;
}
if(z==2){
if(find(x)==find(y)){
ans++;
continue;
}
else{
e[find(x)]=find(y);
b[find(y)]=find(x);
if(e[find(y)]!=0){
b[find(x)]=e[find(y)];
}
if(b[find(x)]!=0){
e[find(y)]=b[find(x)];
}
}
}
else if(z==1){
if(e[find(x)]==find(y)){
ans++;
continue;
}
else if(b[find(x)]==find(y)){
ans++;
continue;
}
else t[find(x)]=find(y);
}
}
cout<<ans;
return 0;
}```