• 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;
    }
  • 相关阅读:
    tp5 select回显
    toFixed
    用js来实现银行家算法
    js 日期证有效性验的通用方法
    js获取或判断任意数据类类型的通用方法(getDataType)和将NodeList转为数组(NodeListToArray)
    js实现jquery函数animate动画效果
    js原生实现 无缝滚动图片
    scrollTop实现图像循环滚动(实例1)
    commonCookie.js
    delphi XE3解析JSON数据
  • 原文地址:https://www.cnblogs.com/Peper/p/8996935.html
Copyright © 2020-2023  润新知