zoukankan      html  css  js  c++  java
  • bzoj4195(并查集+离散化)

    题目大意:给出n个变量互相的相等或不等关系,求这些关系是否矛盾

    思路:把相等的变量加入并查集,不等的查询是否合法

    eg:数据很大,离散化(然而我用的是map)

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<map>
    using namespace std;
    int fa[10000000],n,sum[10000000],tot,T;
    map<int,int> old,tong;
    struct node
    {
        int x,y,c;
    }a[10000000];
    template<class T>void read(T &x)
    {
        x=0;char ch=getchar();
        while(ch<'0'||ch>'9')  ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    }
    int find(int x)
    {
        int p=x,q;
        while(x!=fa[x])
          x=fa[x];
        while(p!=x)
        {
            q=fa[p];
            fa[p]=x;
            p=q;
        }
        return x;
    }
    int main()
    {
        read(T);
        while(T--)
        {
            old.clear();tong.clear();tot=0;bool flag=0;
            read(n);
            for(int i=1;i<=n;i++)
            {
                read(a[i].x);read(a[i].y);read(a[i].c);
                if(tong[a[i].x]==0)
                {   
                    tong[a[i].x]=1;
                    sum[++tot]=a[i].x;
                }
                if(tong[a[i].y]==0)
                {
                    tong[a[i].y]=1;
                    sum[++tot]=a[i].y;
                }   
            }
            sort(sum+1,sum+1+tot); 
            for(int i=1;i<=tot;i++) old[sum[i]]=i;
            for(int i=1;i<=n;i++)
            {
                a[i].x=old[a[i].x];
                a[i].y=old[a[i].y];
            }       
            for(int i=1;i<=tot;i++) fa[i]=i; 
            for(int i=1;i<=n;i++)
            {
                int p=find(a[i].x),q=find(a[i].y);
                if(a[i].c==1&&p!=q) fa[p]=q;
                if(a[i].c!=1&&p==q){flag=1;break;}
            }
            if(flag==1){printf("NO
    ");continue;}
            for(int i=1;i<=n;i++)
            {
                int p=find(a[i].x),q=find(a[i].y);
                if(a[i].c==1&&p!=q){flag=1;break;}
                if(a[i].c==0&&p==q){flag=1;break;}
            }
            if(flag==1)printf("NO
    ");
            else printf("YES
    ");
        }
        return 0;
    }
  • 相关阅读:
    mysql修改加密方式
    信息安全学习路线
    DNS域传送漏洞
    CSRF漏洞
    反序列化漏洞
    计算机通讯基础
    gorm gen使用
    golang makefile使用
    linux命令行录制
    go代码自动生成注释
  • 原文地址:https://www.cnblogs.com/Peper/p/8996935.html
Copyright © 2011-2022 走看看