版权声明:本文为博主原创文章,你们可以随便转载 https://blog.csdn.net/Jaihk662/article/details/83378392
题意:
1-刺猬图满足:
- 是一棵树
- 存在一个中心节点u与其它所有点相连
- 包括中心节点在内,至少4个节点
2-刺猬图满足:
- 是一棵树
- 存在一个中心节点u与其它所有1-刺猬图的中心节点相连
- 这个中心节点至少连接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;
}
}