P2024 食物链

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于P2024 食物链的主要内容,如果未能解决你的问题,请参考以下文章

P2024 食物链

P2024 食物链

做题记录:P2024 食物链(洛谷)

Luogu P2024 食物链

P2024 食物链

洛谷P2024 食物链