树形dp之删边
2015-11-22 16:57
309 查看
【Codeforces Round #263 (Div. 2) D. Appleman and Tree】
一棵由n个点组成的树,标号为0~n-1
输入n-1个数字pi,表示pi与i+1相连
输入n个数xi,xi=0表示这个节点是白色,xi=1表示这个节点是黑色
删掉一些边,使得得到的子树有且仅有一个黑点
v是父节点, u是子节点
dp[ i ][ 0 ]表示经过一系列的删边操作之后, i的子树没有黑点
dp[ i ][ 0 ]表示经过一系列的删边操作之后, i的子树有且仅有一个黑点
(1)dp[ v ][ 1 ] = dp[ v ][ 1 ]*dp[ u ][ 0 ] + dp[ v ][ 1 ]*dp[ u ][ 1 ] + dp[ v ][ 0 ]*dp[ u ][ 1 ]
第一部分表示v、u之间不删边, 第二部分表示v、u之间删边, 第三部分表示v、u之间不删边
(2)dp[ v ][ 0 ] = dp[ v ][ 0 ]*dp[ u ][ 0 ] + dp[ v ][ 0 ]*dp[ u ][ 1 ]
第一部分表示v、u之间不删边,第二部分表示v、u之间删边
一棵由n个点组成的树,标号为0~n-1
输入n-1个数字pi,表示pi与i+1相连
输入n个数xi,xi=0表示这个节点是白色,xi=1表示这个节点是黑色
删掉一些边,使得得到的子树有且仅有一个黑点
v是父节点, u是子节点
dp[ i ][ 0 ]表示经过一系列的删边操作之后, i的子树没有黑点
dp[ i ][ 0 ]表示经过一系列的删边操作之后, i的子树有且仅有一个黑点
(1)dp[ v ][ 1 ] = dp[ v ][ 1 ]*dp[ u ][ 0 ] + dp[ v ][ 1 ]*dp[ u ][ 1 ] + dp[ v ][ 0 ]*dp[ u ][ 1 ]
第一部分表示v、u之间不删边, 第二部分表示v、u之间删边, 第三部分表示v、u之间不删边
(2)dp[ v ][ 0 ] = dp[ v ][ 0 ]*dp[ u ][ 0 ] + dp[ v ][ 0 ]*dp[ u ][ 1 ]
第一部分表示v、u之间不删边,第二部分表示v、u之间删边
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <vector> using namespace std; #define inf 100005 #define mod 1000000007 #define ll __int64 vector<int>vec[inf]; int x[inf]; ll dp[inf][2]; void dfs(int p, int v) { dp[v][0] = dp[v][1] = 0; dp[v][x[v]] = 1; for(int i = 0; i < vec[v].size(); i++) { int u = vec[v][i]; if(u != p) { dfs(v, u); dp[v][1] = (dp[v][1]*(dp[u][0]+dp[u][1])%mod+dp[v][0]*dp[u][1]%mod)%mod; dp[v][0] = (dp[v][0]*dp[u][0]%mod+dp[v][0]*dp[u][1]%mod)%mod; } } } int main() { int n, pi; scanf("%d", &n); for(int i = 0; i < n; i++) vec[i].clear(); for(int i = 0; i < n-1; i++) { scanf("%d", &pi); vec[pi].push_back(i+1); vec[i+1].push_back(pi); } for(int i = 0; i < n; i++) { scanf("%d", &x[i]); } memset(dp, 0, sizeof(dp)); dfs(-1, 0); printf("%I64d\n", dp[0][1]); return 0; }
相关文章推荐
- Jade之Code
- 信息安全系统设计基础实验一—20135222胡御风20135215黄伟业
- P问题、NP问题、NPC问题以及NP-hard问题理解与区分
- 中间件简介
- 【C语言】【面试题】【笔试题】模拟实现strncpy
- maven学习2——pom.xml详解
- NYOJ-20 吝啬的国度
- ls ,tree,用法简单命令;alias别名用法(临时设置和永久设置)
- Jade之属性
- 第十一章 Intent原理与使用
- 【网络基础】计算机网络常考知识点整理
- iOS中的隐式动画
- 雨天+图书馆+一个人——忍不住记录一下最近
- 【NOIP2015】D2-T1跳石头,二分答案
- VC 6.0调试方法
- leetcode Merge Two Sorted Lists
- 关于Android 中 Bitmap 内存回收的一点心得
- Oracle函数
- 第十章 外观与样式
- [LeetCode]Binary Tree Inorder Traversal