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

树形 dp

fi 表示在编号为 i 的子树中共有多少种方案。

显然,fu=vsonufv+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 @   A_zjzj  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示