HDU 4751 — Divide Groups

来源:互联网 发布:淘宝怎么改宝贝类目 编辑:程序博客网 时间:2024/05/18 00:21

原题:http://acm.hdu.edu.cn/showproblem.php?pid=4751

题意:

   有n个人,下面n行;

   表示第i个人认识的人,以0结束;

   问能不能分成两个组,使得组内任意两个人相互认识;


思路:

  用0和1表示两个组;

  b[i]表示第i个人所属的组别;

  如果两个人不认识,就是在不同的组;



#include<stdio.h>#include<queue>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int n;bool map[110][110];int b[110];int bfs(int x){queue<int>q;q.push(x);while(!q.empty()){int u = q.front();q.pop();for(int i = 1;i<=n;i++){if(i == u || (map[i][u] && map[u][i]))continue;if(b[i] == -1){b[i] = b[u]^1;q.push(i);}else if(b[i] == b[u])return 1;}}return 0;}int main(){while(scanf("%d", &n)!=EOF){memset(map, false, sizeof(map));for(int i = 1;i<=n;i++){int x;scanf("%d", &x);while(x != 0){map[i][x] = true;scanf("%d", &x);}}memset(b, -1, sizeof(b));int i;for(i = 1;i<=n;i++){if(b[i] == -1){b[i] = 0;if(bfs(i))break;}}if(i>n)printf("YES\n");elseprintf("NO\n");}return 0;}


0 0