zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    2013551822第一次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/2017noipak/p/7784818.html
Copyright © 2011-2022 走看看