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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号