#include <stdio.h>
#include <cstring>using namespace std;
int map[10][10];
int root[10];
bool flag;
int n, m;void DFS(int x, int y)
{
if(flag)
return;
if(y > m) //如果皮球数大于m
return;
if(x == n) //如果人数等于n,并且皮球数小于m
{
flag = true;
return;
}
for(int i = 0; i < x; i++)
{
if(root[i] != i) //找到根节点
continue;
//判断x是否可以加入到根节点集合
bool tag = true;
for(int j = 0; j < x; j++)
{
if(root[j] == i && map[j][x] == 0)
{
tag = false;
break;
}
}
//如果可以加入
if(tag)
{
root[x] = i; //将x加入
DFS(x+1, y); //情况1:将人数加一,皮球数不变
root[x] = x;
}
}
DFS(x+1, y+1); // 若情况1不成立,则将皮球数再加一
}int main()
{
while(~scanf("%d%d", &n, &m))
{
memset(map, 0, sizeof(map));
int k, x;
for(int i = 0; i < n; i++)
{
scanf("%d", &k);
root[i] = i;
for(int j = 0; j < k; j++)
{
scanf("%d", &x);
map[i][x] = 1; //没有冲突的标记为true;
}
}
flag = false;
DFS(0, 0);
if(m >= n || flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
HDU-2208-唉可爱的小朋友 (DFS)
最新推荐文章于 2020-03-21 14:50:23 发布