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;
}