码迷,mamicode.com
首页 > 其他好文 > 详细

P2024 食物链

时间:2017-11-04 23:33:45      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:合并   数组   .com   str   ring   color   ios   char   cstring   

题面: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 食物链

标签:合并   数组   .com   str   ring   color   ios   char   cstring   

原文地址:http://www.cnblogs.com/2017noipak/p/7784818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!