1. 程式人生 > >Codeforces Round #518 (Div. 2): E. Multihedgehog(模擬)

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

題意:

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;
	}
}