P2024 食物链

并查集的题

关于带有多个相对集合的全集,我们可以多开几倍的空间。每一倍的元素表示这个当前里的相对元素


#include<iostream> 
#include<cstdio>
#include<algorithm>
using namespace std;
int f[600000];
int find(int x)
{
    if(f[x]==x)
        return x;
    return f[x]=find(f[x]);
}
int _union(int x,int y)
{
    int f1=find(x),f2=find(y);
    f[f1]=f2;
}
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    int a,b,c;
    for(int i=1;i<=3*n;i++)
        f[i]=i;
    int t=0;
    for(int i=1;i<=k;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(b>n||c>n)
        {
            t+=1;
            continue;
        }
        if(a==1)
        {
            if(find(b+n)==find(c)||find(b+2*n)==find(c))
            {
                t+=1;
                continue;
            }
            _union(b,c);
            _union(b+n,c+n);
            _union(b+2*n,c+2*n);
        }
        if(a==2)
        {
            if(b==c)
            {
                t+=1;
                continue;
            }
            if(find(b+n)==find(c)||find(b)==find(c))
            {
                t+=1;
                continue;
            }
            _union(b+2*n,c);
            _union(b,c+n);
            _union(b+n,c+2*n);
        }
    }
    printf("%d",t);
}

肯定有一些自恃NB的不会看的

posted @ 2018-03-25 11:49  Lance1ot  阅读(121)  评论(0编辑  收藏  举报