CCC 加拿大国赛第一轮S组t3 Unfriend--zhengjun

树形 \(dp\)

\(f_i\) 表示在编号为 \(i\) 的子树中共有多少种方案。

显然,\(f_u=\prod\limits_{v\subseteq son_u}{f_v}+1\)

后面的那个 \(1\) 就是考虑自身不要的情况。最后答案要减掉这个 \(1\)

代码

#include<cstdio>
using namespace std;
int n,x;
struct edges{
	int to,nex;
}edge[1001];
int head[1001],kk;
void add(int u,int v){
	edge[++kk]=(edges){v,head[u]};head[u]=v;
}
int f[1001];
void dfs(int u){
	f[u]=1;
	for(int i=head[u];i;i=edge[i].nex){
		int v=edge[i].to;
		dfs(v);
		f[u]*=f[v];
	}
	f[u]++;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++)scanf("%d",&x),add(x,i);
	dfs(n);
	printf("%d",f[n]-1);
	return 0;
}
posted @ 2022-06-11 15:13  A_zjzj  阅读(19)  评论(0编辑  收藏  举报