http://codeforces.com/problemset/problem/1067/B
题意:
1-刺猬图满足:
是一棵树
存在一个中心节点u与其它所有点相连
每个中心节点,至少与3个节点相连
2-刺猬图满足:
是一棵树
存在一个中心节点u与其它所有1-刺猬图的中心节点相连
这个中心节点至少连接3个以上的1-刺猬图
k-刺猬图依次类推,给你一棵树,问你它是不是k-刺猬图!
给你 n,k
问你是否能建出树来
一层一层把最外面度数为1的节点去掉,然后看去掉节点的另一端度数是否是>=3
看删完k层后是否还留下且只留下一个度数>=3的点
wa在122组神仙样例!!!
看代码吧
还要记得每次删完v后,剩下的u是只跟一个点连的
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int from[maxn],to[maxn],vis[maxn],du[maxn];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
from[i]=u,to[i]=v;
du[u]++,du[v]++;
}
if(n<=3||k>12)
{
printf("No\n");
return 0;
}
set <int> s;
int num=0,f;
for(int i=1;i<=k;i++)
{
for(int j=1;j<n;j++)
{
if(du[from[j]]==0||du[to[j]]==0) continue;
if(du[from[j]]==1)
{
s.insert(to[j]);
vis[to[j]]++;
du[from[j]]--;
num++;
}
else if(du[to[j]]==1)
{
s.insert(from[j]);
vis[from[j]]++;
du[to[j]]--;
num++;
}
}
for(auto x:s)
{
f=x;
if(i==k) continue;
if(du[x]>3&&du[x]-vis[x]==1)
{
du[x]=1;
}
else
{
printf("No\n");
return 0;
}
}
s.clear();
if(i==k&&num==n-1&&du[f]>=3)
{
printf("Yes\n");
return 0;
}
}
printf("No\n");
return 0;
}
/*
21 2
3 1
4 1
5 1
6 2
7 2
8 2
1 2
9 1
9 10
9 11
9 12
10 13
10 14
10 15
11 16
11 17
11 18
12 19
12 20
12 21
*/