HDOJ 4751 - Divide Groups 暴力DFS

原创 2013年09月21日 20:41:26

                题意:

                        有一群人,有的人认识某些人(认识的关系是单向的)...现在需要将这些人分成两个部分,而一个好的部分为以下定义:

                       1、一个部分的人数多少与好坏无关

                       2、一个部分中所有的人都是两两认识的

                       问能否将所有的人成功划分成两个好的部分.

               题解:

                       因为关系牵扯错纵复杂,直接DFS就好..自然的会有很多剪枝...


Program:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdlib>
#include<stack>
#include<map>
#define MAXN 10005
#define MAXM 1000505
#define ll long long 
#define eps 1e-10
using namespace std;  
bool f[105][105];
int b[105];
bool judge(int x,int n)
{
    int i;
    if (x>n) return true; 
    for (i=1;i<=n;i++)
       if (b[i]==1 && (!f[i][x] || !f[x][i])) break;
    if (i<=n)
    {
          for (i=1;i<=n;i++)
             if (b[i]==2 && (!f[i][x] || !f[x][i])) break;
          if (i<=n) return false;
          b[x]=2;
          if (judge(x+1,n)) return true;
          b[x]=0;
    }else
    {
          for (i=1;i<=n;i++)
             if (b[i]==2 && (!f[i][x] || !f[x][i])) break;
          if (i<=n)
          {
                 b[x]=1;
                 if (judge(x+1,n)) return true;
                 b[x]=0;
          }else
          {
                 b[x]=1;
                 if (judge(x+1,n)) return true;
                 b[x]=2;
                 if (judge(x+1,n)) return true;
                 b[x]=0;                
          }
    } 
    return false;
}
int main()
{
    int n,i,j,x; 
    while(~scanf("%d",&n))
    {  
              memset(f,false,sizeof(f));
              for (i=1;i<=n;i++)
                 while (scanf("%d",&x) && x) f[i][x]=true;  
              memset(b,0,sizeof(b));
              if (!judge(1,n)) printf("NO\n");
                         else  printf("YES\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kk303/article/details/11880487

hdu 4751 Divide Groups (两种解法 1.bfs 2.dfs)

Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • u010228612
  • u010228612
  • 2013-09-21 23:40:45
  • 2095

HDOJ 4751 Divide Groups

染色判断二分图+补图比赛的时候题意居然是反的,看了半天样例都看不懂 。。。。Divide GroupsTime Limit: 2000/1000 MS (Java/Others)    Memory ...
  • u012797220
  • u012797220
  • 2014-11-04 11:22:07
  • 328

HDU 4751 Divide Groups

二分图的判定问题...  利用二分图的一个性质X(Y)点集内的任意两点是不存在边的,所以建立补图一个二分图的判定就可以搞定了。。。 #include #include #include #...
  • u011728372
  • u011728372
  • 2013-09-21 18:41:49
  • 819

HDU 4751 — Divide Groups

原题:http://acm.hdu.edu.cn/showproblem.php?pid=4751 题意:    有n个人,下面n行;    表示第i个人认识的人,以0结束;    问能不能分...
  • L__emon
  • L__emon
  • 2015-05-10 21:21:54
  • 275

hdu 4751 Divide Groups

二分图染色
  • chai_jing
  • chai_jing
  • 2016-11-04 16:55:54
  • 272

HDU:4751 Divide Groups

今年网络赛的一道题。问是否能分成两个完全图,转化为判断是否二分图。 关键在于建图上面。 如果两个人不是互相认识,那么一定处于不同集合,根据这点建图,也就是不是互相认识的人之间连边。   #includ...
  • kkkwjx
  • kkkwjx
  • 2013-12-16 14:03:05
  • 506

Divide Groups HDU - 4751

Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • khn64
  • khn64
  • 2017-08-25 21:28:37
  • 69

hdu 4751——Divide Groups

http://www.cppblog.com/linyangfei/archive/2008/08/08/58295.html很详细了。 #include #include #include u...
  • softrice2012
  • softrice2012
  • 2013-09-21 18:39:29
  • 792

hdu 4751 Divide Groups 染色

建个反向图,染个色,一切不言而喻    今天比赛一直把题目想复杂,没改题前先求了重联通图,改题后又试了极大团,2sat等等。还是基础不牢,概念不清 /* author:jxy lang:C/C...
  • czjxy881
  • czjxy881
  • 2013-09-22 01:07:59
  • 678

HDU - 4751 Divide Groups 二分图判定

其实就是分成两个集合,判断是否合法 对于本题:有的人和两个集合的人都认识 所以放到哪个里面都行,,所以 判断不合法的依据是: 放到了一个集合中,但是 存在有两个人认不认识的情况 #include ...
  • xiang_6
  • xiang_6
  • 2017-06-27 22:25:42
  • 82
收藏助手
不良信息举报
您举报文章:HDOJ 4751 - Divide Groups 暴力DFS
举报原因:
原因补充:

(最多只允许输入30个字)