自己选择的路,跪着也要走完! WJMZBMR

bjqstar

P2024 食物链

题面: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;
}

 

posted on 2017-11-04 22:10  bjqstar  阅读(175)  评论(5编辑  收藏  举报

导航