• 食物链


    100 7
    1 101 1
    2 1 2
    2 2 3
    2 3 3
    1 1 3
    2 3 1
    1 5 5
    #include<cstdio>
    using namespace std;
    int f[200000];
    int ans;int n;int k;
    int find(int x)
    {
        if(f[x]==x) return x;
        int fx=find(f[x]);
        return f[x]=fx;
    }
    void bing(int a,int b,int c)
    {
        int fx=find(b);
        int fy=find(c);
        if(a==1)
        {
            if(fx==fy) return;
            if(fx==find(n+c)||fx==find(2*n+c)||fy==find(n+b)||fy==find(2*n+b)) {
                ans++;
                return;
            }
            f[fx]=f[fy];//自己的祖先是同类
            f[find(b+n)]=f[find(c+n)];//吃b的和吃c的是同类
            f[find(b+2*n)]=f[find(c+2*n)];//被b吃的和被c吃的是同类
        }
        if(a==2)
        {
            if(fx==fy||fx==find(c+2*n)||fy==find(b+n)) {
                ans++;
                return;
            }
            f[fx]=find(c+n);//b和吃c的是同类
            f[fy]=find(b+2*n);//c和被b吃的是同类
            f[find(b+n)]=find(c+2*n);//吃b的和被c吃的是同类
        }
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=3*n;i++)
        f[i]=i;
        for(int i=1;i<=k;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            if(b>n||c>n)
            {
                ans++;
                continue;
            }
            if(b==c&&a==2) {
                ans++;
                continue;
            }
            bing(a,b,c);
        } 
        printf("%d",ans);
    }
    return 0;

    反集,比较容易理解,就是有点绕

    #include<cstdio>
    using namespace std;
    int f[219999];
    int front[219999];
    int ans;int n;int k;
    int find(int x)
    {
        if(f[x]==x) return x;
        int fx=find(f[x]);
        front[x]+=front[f[x]];
        front[x]=front[x]%3;
        return f[x]=fx;
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
        f[i]=i;
        for(int i=1;i<=k;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
    
            if(b>n||c>n)
            {
                ans++;
                continue;
            }
            if(b==c&&a==2) 
            {
                ans++;
                continue;
            }
            int fx=find(b),fy=find(c);
            if(fx==fy)
            {
                if((front[b]-front[c]+3)%3!=a-1) ans++;
                continue;
            }
                f[fx]=fy;
                front[fx]=(-front[b]+front[c]+a-1+3)%3;
        }
        printf("%d",ans);
        return 0;
    } 

    带权并查集
    这里写图片描述

  • 相关阅读:
    16、集合--Map接口
    LVM快照备份与恢复
    CentOS 6.3下配置LVM(逻辑卷管理)
    Tomcat 9.0 配置问题 403 Access Denied
    nginx和php-fpm调用方式
    Linux下安装php环境并且配置Nginx支持php-fpm模块
    Nginx 服务器安装及配置文件详解
    Linux编辑器vim键盘详解
    Nginx配置文件详解
    keepalive配置文件详解
  • 原文地址:https://www.cnblogs.com/wspl98765/p/6819889.html
Copyright © 2020-2023  润新知