原题: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");
else
printf("NO\n");
}
return 0;
}