题面:P2024 食物链
emmm其实不太难想
开三倍的数组
1~n:是当前动物的同类
n~2*n:是当前动物吃的动物
2*n~3*n:是吃当前动物的动物
emmmm
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int rd(){ int x=0,fl=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')fl=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return fl*x; } int n,m,fa[300100];//三倍数组 int x,y,z,ans=0; int find(int x){ //查 if(x!=fa[x]) fa[x]=find(fa[x]); return fa[x]; } void un(int x,int y){ int lx=find(x),ly=find(y);//并 fa[ly]=lx; }//常规操作 int main(){ n=rd();m=rd(); for(int i=1;i<=3*n;i++)fa[i]=i; for(int i=1;i<=m;i++){ x=rd();y=rd();z=rd(); if(y>n||z>n){ans++;continue;} int lx=find(y),ly=find(z); if(x==1){ if(find(y+n)==ly||find(y+2*n)==ly/*z吃y*/){ans++;continue;} un(y,z);//以下三行合并同类 un(y+n,z+n); un(y+(n<<1),z+(n<<1)); } if(x==2){ if(lx==ly/*y和z同类*/||find(z+n)==lx/*z吃y*/){ans++;continue;} un(z,y+n);//以下三行合并异类 un(z+n,y+(n<<1)); un(z+(n<<1),y); } } printf("%d",ans); return 0; }