今天比赛之郁闷,这么简单的题当时都写的好复杂~悲剧~!!!!
题目是问你是否可以将所给的n个人分成2个组,分组的规则是要求组内所有的人可以互相认识才可以为一组,但注意的是A认识B,B认识C,并不代表A认识C,也就是说关系不可以传递的,只有当A认识C才能是A认识C,而且需要注意的是互相认识的意思是说A认识B并且B要认识A才算互相认识~
剩下的就比较简单了~
唉,直接DFS即可,注意剪枝~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=110;
int n,map[maxn][maxn];
bool ans,use[maxn];
void DFS(int now)
{
if(now==n+1)
ans=1;
int flag=0;
for(int i=1;i<now;i++)
if(use[i]&&map[now][i]!=2)
{
flag=1;
break;
}
if(!flag)
{
use[now]=1;
DFS(now+1);
if(ans)
return;
use[now]=0;
}
for(int i=1;i<now;i++)
if(!use[i]&&map[now][i]!=2)
return;
DFS(now+1);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
memset(use,0,sizeof(use));
int num=0;
for(int i=1;i<=n;i++)
{
int cnt=0;
while(1)
{
int u;
scanf("%d",&u);
if(!u)
break;
cnt++;
map[i][u]++;
map[u][i]++;
}
if(!cnt)
num++;
}
if(num>2)
{
printf("NO\n");
continue;
}
ans=0;
use[1]=1;
DFS(2);
if(ans)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}