zoukankan      html  css  js  c++  java
  • HDU 4751 (向量并查集+思路)

    题目大意:判断一堆人能否分成两组,组内人都互相认识。

    思路:不认识的人一定不在一起!

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<vector>
    #define tree int o,int l,int r
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define lo o<<1
    #define ro o<<1|1
    #define ULL unsigned long long
    #define LL long long
    #define inf 0x7fffffff
    #define eps 1e-7
    #define M 9901
    #define N 109
    using namespace std;
    int T,n,m,k,t;
    int f[N],h[N],val[N];
    int find(int x)
    {
        if(f[x]!=x)
        {
            int tou=f[x];
            f[x]=find(f[x]);
            val[x]=(val[x]+val[tou])%2;
        }
        return f[x];
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("ex.in","r",stdin);
    #endif
        vector<int>g[N];
        while(scanf("%d",&n)==1)
        {
            for(int i=0;i<=n;i++)
            {
                g[i].clear();//WA
                f[i]=i;
                val[i]=0;
            }
            for(int i=1; i<=n; i++)
            {
                memset(h,0,sizeof(h));
                h[i]=1;
                while(1)
                {
                    int t;
                    scanf("%d",&t);
                    if(!t)break;
                    h[t]=1;
                }
                for(int j=1; j<=n; j++)
                    if(!h[j])
                    {
                        g[i].push_back(j);
                    }
            }
            int ok=1;
            for(int i=1;i<=n&&ok;i++)
            {
                for(int j=0;j<g[i].size();j++)
                {
                    int u=i,v=g[i][j];
                    int toux=find(u);
                    int touy=find(v);
                    if(toux!=touy)
                    {
                        int g=val[u]+val[v]+1;
                        g%=2;
                        f[touy]=toux;
                        val[touy]=g;
                    }
                    else
                    {
                        int g=val[u]+val[v];
                        g%=2;//WA
                        if(g!=1)
                        {
                            ok=0;break;
                        }
                    }
                }
            }
            printf("%s
    ",ok?"YES":"NO");
        }
        return 0;
    }
  • 相关阅读:
    log4j(七)——log4j.xml简单配置样例说明
    log4j(六)——log4j.properties简单配置样例说明
    三元运算符注意事项
    单精度浮点数操作
    反转链表算法Java实现
    VBS计时器2
    肖申克的救赎影评
    计算机中K到底是1000还是1024?
    二进制补码除法——计算机底层整数除法模拟之Java实现
    VBS计时器
  • 原文地址:https://www.cnblogs.com/sbaof/p/3332507.html
Copyright © 2011-2022 走看看