【树形DP】51Nod 1500 苹果曼和树
来源:互联网 发布:淘宝店主自己做模特 编辑:程序博客网 时间:2024/06/04 21:41
题面在这里
定义
那么对于
对于
示例程序:
#include<cstdio>typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline int red(){ int res=0,f=1;char ch=nc(); while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();} while ('0'<=ch&&ch<='9') res=res*10+ch-48,ch=nc(); return res*f;}const int maxn=100005,maxe=200005,tt=1000000007;int n,c[maxn];int tot,lnk[maxn],nxt[maxe],son[maxe];ll f[maxn][2];inline void add(int x,int y){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;}void dfs(int x,int fa){ f[x][c[x]]=1; for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=fa){ dfs(son[j],x); f[x][1]=(f[x][1]*(f[son[j]][0]+f[son[j]][1])%tt+f[x][0]*f[son[j]][1])%tt; (f[x][0]*=f[son[j]][0]+f[son[j]][1])%=tt; }}int main(){ n=red(); for (int i=1,x,y;i<n;i++) x=red()+1,y=i+1,add(x,y),add(y,x); for (int i=1;i<=n;i++) c[i]=red(); dfs(1,0); printf("%lld",f[1][1]); return 0;}
阅读全文
1 0
- 51nod 1500 苹果曼和树(树形dp)
- 51 nod 1500 苹果曼和树(树形DP)
- 【树形DP】51Nod 1500 苹果曼和树
- 51nod 1500 苹果曼和树【树形DP】
- 51nod 1500 苹果曼和树 树形DP
- 51nod 苹果曼和树 (树形dp)
- [树形DP]51 Nod 1500——苹果曼和树
- [树形DP] 51Nod1500 苹果曼和树
- 51Nod-1500-苹果曼和树
- 51nod 1424 零树(树形dp)
- 51 nod 苹果曼和树
- 51Nod - 1737 树形dp
- 51Nod 1405 树的距离之和(树形dp)
- 51NOD-1405 树的距离之和(树形DP)
- 51nod 1405 树的距离之和【树形dp】
- 51nod 1405 树的距离之和 (树形dp)
- 51 nod 1412 AVL树的种类(树形DP)
- 51Nod - 1677 树形dp + 组合数学
- 二分图的最大匹配、完美匹配和匈牙利算法
- 爬虫之旅(五)
- [NOIP2017模拟]杆子的排列
- vs2015配置opencv3.2后又换opencv3.3出现的C4996问题
- 缓存
- 【树形DP】51Nod 1500 苹果曼和树
- TreeMap
- 数据结构--双向约瑟夫
- LeetCode——Hamming Distance
- 设计模式之适配器模式(Adapter):类适配器、对象适配器
- Java 通过JDBC进行数据操作(增删改查)
- 魔漫相机面试心得
- 物理层——计算机网络原理(三)
- Android Gradle学习记录6 代码记录(持续补充)