D. Decorate Apple Tree
题意
给你一棵树每个叶子节点上都有一个颜色,
如果某个节点是好节点,要满足他子树内所有的叶子节点颜色不同
对每个k∈[1,n]对每个k\in[1,n]对每个k∈[1,n]输出至少有k个点为好点最少需要多少种颜色
做法
每次选出的k个点最后只有一个点是有效的,也就是子树叶子节点最多的那个点
选n个点时一定是根,选n-1个点时一定是去掉根之后包含叶子节点最多的点
继续往下同理,而一棵树的点一共有n个,所以只要对n个节点按照包含叶子节点的个数排序
之后输出就可以了。
代码
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5+5;
vector<int> G[maxn];
vector<int> ans;
int sum[maxn];
void dfs(int u)
{
if(G[u].size()==0)
{
sum[u]=1;
return ;
}
for(int i=0;i<G[u].size();i++)
{
dfs(G[u][i]);
sum[u]+=sum[G[u][i]];
}
return ;
}
int main()
{
int n,x;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
G[x].push_back(i);
}
dfs(1);
sort(sum+1,sum+1+n);
for(int i=1;i<=n;i++) printf("%d ",sum[i]);
return 0;
}