HDU:4751 Divide Groups

今年网络赛的一道题。问是否能分成两个完全图,转化为判断是否二分图。

关键在于建图上面。

如果两个人不是互相认识,那么一定处于不同集合,根据这点建图,也就是不是互相认识的人之间连边。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#define MAXN 105
using namespace std;
bool gl[MAXN][MAXN];
bool newgl[MAXN][MAXN];
int n;
int col[MAXN];
bool dfs(int v,int c)
{
    col[v]=c;
    for(int i=1; i<=n; ++i)
        if(newgl[v][i])
        {
            if(col[v]==col[i]) return false;
            if(!col[i]&&!dfs(i,-c)) return false;
        }
    return true;
}
bool solve()
{
    memset(col,0,sizeof(col));
    for(int i=1; i<=n; ++i)
        if(!col[i])
        {
            if(!dfs(i,1)) return false;
        }
    return true;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(gl,0,sizeof(gl));
        int v;
        for(int i=1; i<=n; ++i)
        {
            while(scanf("%d",&v)&&v)
                gl[i][v]=true;
        }
        memset(newgl,1,sizeof(newgl));
        for(int i=1; i<=n; ++i)
        {
             newgl[i][i]=false;
             for(int j=1; j<=n; ++j)
                if(gl[i][j]==gl[j][i]&&gl[i][j])
                    newgl[i][j]=newgl[j][i]=false;
        }
        if(solve()) puts("YES");
        else puts("NO");
    }
    return 0;
}


 

你可能感兴趣的:(二分图)