Codeforces Round #518 (Div. 2): E. Multihedgehog(模拟)

版权声明:本文为博主原创文章,你们可以随便转载 https://blog.csdn.net/Jaihk662/article/details/83378392

题意:

1-刺猬图满足:

  1. 是一棵树
  2. 存在一个中心节点u与其它所有点相连
  3. 包括中心节点在内,至少4个节点

2-刺猬图满足:

  1. 是一棵树
  2. 存在一个中心节点u与其它所有1-刺猬图的中心节点相连
  3. 这个中心节点至少连接3个以上的1-刺猬图

k-刺猬图依次类推,给你一棵树,问你它是不是k-刺猬图

思路:

按题意模拟即可,注意细节

  • k这么大肯定毫无意义,当k超过15时就一定是no了,因为没有那么多节点(大概节点个数要是3的k次方倍)
  • 直接递归不容易出错,也就是每次将叶子节点删掉即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
vector<int> G[100005];
int in[100005][16], flag[100005];
int main(void)
{
	int n, k, x, y, i, j, p, v, sum;
	scanf("%d%d", &n, &k);
	for(i=1;i<=n-1;i++)
	{
		scanf("%d%d", &x, &y);
		G[x].push_back(y);
		G[y].push_back(x);
		in[x][0]++, in[y][0]++;
	}
	if(k>=15 || n<=3)
		printf("No\n");
	else
	{
		sum = n;
		for(p=1;p<=k;p++)
		{
			for(i=1;i<=n;i++)
			{
				if(in[i][p-1]==1)
				{
					for(j=0;j<G[i].size();j++)
					{
						v = G[i][j];
						if(flag[v])
							continue;
						if(flag[v]==0 && in[v][p-1]==1)
						{
							printf("No\n");
							return 0;
						}
						in[v][p]++;
					}
					flag[i] = 1, sum--;
				}
			}
			for(i=1;i<=n;i++)
			{
				if(in[i][p]==0 || flag[i])
					continue;
				if(in[i][p]<=2)
				{
					printf("No\n");
					return 0;
				}
				in[i][p] = 1;
			}
			if(sum==1)
			{
				if(p==k)
					printf("Yes\n");
				else
					printf("No\n");
				return 0;
			}
		}
		printf("No\n");
		return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/83378392