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

题意:人与人之间可以认识或不认识,可以单向认识也可以双向认识,给你他们认识的关系,让你将他们分成两组,每组里面的任意两个人都认识。
转化一下,将双向认识的人之间不连边,单向认识或不认识的人连边,然后判二分图就行了。
#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;
}

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

时间: 2024-10-16 16:35:59

hdu 4751 判二分图,整个图不一定连通的相关文章

hdu 4751 Divide Groups 二分图

题意给出所有人之间的关系,单向的,问能不能将这群人分成两组,使得每组内部的任意两人都互相认识. 先把单向边都换成无向边,即如果a,b互相认识那么不变,如果只是单向边的话那么则认为他们两个不认识,然后假设能分成满足题意的两个集合,那么新图的补图中这两个集合内部是没有边的,所以只要判断补图是不是二分图即可. #include <cstdio> #include <cstring> #include <queue> using namespace std; int G[210

(0染色判定二分图) hdu 4751

J - Divide Groups Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4751 Appoint description:  System Crawler  (2015-04-14) Description   This year is the 60th anniversary of NJUST, and to make th

Hdu 4751(2-SAT)

题目链接 Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1153    Accepted Submission(s): 418 Problem Description   This year is the 60th anniversary of NJUST, and to make the celebrati

hdu 3061 hdu 3996 最大权闭合图 最后一斩

hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996.  gold mine..看了一下,简单题,几乎裸,不敲了.. #include<iostream>//Battle #include<queue> #include<cstdio> #include<cstring> #include<set> #i

POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)

题目链接:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 3325 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobi

hdu 3605 Escape (二分图多重匹配)

Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4298    Accepted Submission(s): 1129 Problem Description 2012 If this is the end of the world how to do? I do not know how. But now scient

hdu 3917 最大权闭合图

/*最大权闭合图: 题意:一些城市需要建路需要一些公司来负责,每个公司需要交一定的税,每条路需要给公司一定的花费,还有一个限制条件,假如说公司a建立了a-b,公司b建立了b-c那么选择 公司a 那么必须选择公司b. 现在要求最大收益. 解:设置一个源点和汇点,将选每个公司的收益和算出来,如果为正值和源点相连,如果为负值和和汇点相连权值为其绝对值,中间的公司之间有关系的权值置为inf, 最大权闭合图=所有正收益的和-最小割. */ #include<stdio.h> #include<st

hdu 2987最大权闭合图模板类型题

/* 最大权闭合图模板类型的题,考验对知识概念的理解. 题意:现在要辞退一部分员工,辞退每一个员工可以的到一部分利益(可以是负的),并且辞退员工,必须辞退他的下属,求最大利益和辞退的最小人数. 最大权闭合图模板类型. 求出最大权后沿着源点s,dfs到的点就为最小的人数. 证明/* 转载:利用一个经典的trick:多关键字 > 建图前,对所有b[i],执行变换b[i]=b[i]*10000-1,然后,会惊异地发现, > 此时最大流所对应的方案就是满足辞退最少人数的了. > 为什么?显然,变

MZL&#39;s City (hdu 5352 最小费用流 ||二分图匹配)

MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 719    Accepted Submission(s): 251 Problem Description MZL is an active girl who has her own country. Her big country has N cities num