题意:
问需要多少种颜色对一棵树的叶子节点进行染色,使得有
k
(
1
<
=
k
<
=
n
)
个
快
乐
节
点
k(1<=k<=n)个快乐节点
k(1<=k<=n)个快乐节点
快乐节点定义为如果该节点的所有叶子节点颜色均不同。
(一开始看错题意以为是每个节点的颜色都要不一样
正确理解题意后其实就是求每个节点有多少个叶子节点,叶子节点本身就算一个。
一个裸的树 D F S DFS DFS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <string>
using namespace std;
typedef long long ll;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x&-x
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const double pi = acos(-1.0);
int n;
vector<int>vec[maxn];
int son[maxn],out[maxn];
void dfs(int u,int fa){
int sz = vec[u].size();
if(out[u] == 0) son[u] = 1;
//else son[u] = son[fa];
for(int i = 0; i < sz; i++){
int v = vec[u][i];
if(v == fa) continue;
dfs(v,u);
son[u] += son[v];在这里插入代码片
}
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&n);
for(int i = 2,x; i <= n; i++){
scanf("%d",&x);
vec[i].push_back(x);
vec[x].push_back(i);
out[x]++;
}
dfs(1,0);
sort(son+1,son+n+1);
for(int i = 1; i <= n; i++)
printf("%d ",son[i]);
return 0;
}