码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4751 判二分图,整个图不一定连通

时间:2015-07-01 20:41:55      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

题意:人与人之间可以认识或不认识,可以单向认识也可以双向认识,给你他们认识的关系,让你将他们分成两组,每组里面的任意两个人都认识。
转化一下,将双向认识的人之间不连边,单向认识或不认识的人连边,然后判二分图就行了。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int maxn=105;
int maze[maxn][maxn];
int imap[maxn][maxn];
int color[maxn];
int n;
bool fuck_dfs(int u,int f)
{
    for(int i=1; i<=n; i++)
    {
        if(imap[u][i]==0||i==f) continue;
        if(color[u]==color[i]) return false;
        if(!color[i])
        {
            color[i]=3-color[u];
            if(!fuck_dfs(i,u)) return false;
        }
    }
    return true;
}

int main()
{
    int a;
    while(~scanf("%d",&n))
    {
        memset(maze,0,sizeof(maze));
        for(int i=1; i<=n; i++)
        {
            while(scanf("%d",&a))
            {
                if(a==0) break;
                maze[i][a]=1;
            }
        }
        memset(imap,0,sizeof(imap));
        for(int i=1; i<=n; i++)
        {
            for(int j=i+1; j<=n; j++)
            {
                if(maze[i][j]&&maze[j][i]) continue;
                imap[i][j]=imap[j][i]=1;
            }
        }
        int flag=0;
        memset(color,0,sizeof(color));
        for(int i=1; i<=n; i++)
        {
            if(color[i]==0)
            {
                color[i]=1;
                if(!fuck_dfs(i,i))
                {
                    flag=1;
                    break;
                }
            }
        }
        if(flag) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4751 判二分图,整个图不一定连通

标签:

原文地址:http://blog.csdn.net/hitwhacmer1/article/details/46713079

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!