cut(树形DP)
Description
F大爷热爱切树。今天他找到一棵黑白树,不到两秒钟,F大爷就把这棵树切掉了。已知原先树上共n个点,每个点都是黑点或者白点,F大爷切去若干条边后,分成的若干个连通子树中每块恰有一个黑点, 请问有多少种切树的方案满足这个条件?两种方案不同当且仅当存在一条边在其中一个方案中被切而在另一个方案中没被切。
n<=10^5,至少有一个黑点。
Input Format
第一行一个正整数n,表示树的点数,点编号1~n
第二行n 个数,每个数字为0或1,依次表示每个点的颜色,若第i个数字为1,则i号点为黑点,否则i号点为白点。
接下来n-1行, 每行两个正整数, 表示树上的一条边连接的两点。
Output Format
输出一个整数,表示答案对10^9+7 取模后的结果。
Solution
显然树形DP,思路就不讲了,
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
#define N 100010
using namespace std;
const int yh=1e9+7;
struct info{int to,nex;}e[N*2];
int n,tot,head[N*2],c[N],in[N],cnt;
ll f[N][2],Ans;
inline void Link(int u,int v){
e[++tot].to=v;
e[tot].nex=head[u];
head[u]=tot;
}
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll DP(int u,int x,int fa){
ll &tmp=f[u][x];
if(tmp!=-1) return tmp;
tmp=!x;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v==fa) continue;
if(x==0){
if(c[v]==1) tmp=(tmp*1ll*DP(v,0,u))%yh;
else tmp=(tmp*1ll*(DP(v,0,u)+DP(v,1,u)))%yh;
}else{
ll sum=1;
if(c[v]==1) sum=(sum*1ll*DP(v,0,u))%yh;
else sum=(sum*1ll*DP(v,1,u))%yh;
for(int j=head[u];j;j=e[j].nex){
int tv=e[j].to;
if(tv==v||tv==fa) continue;
if(c[tv]==1) sum=(sum*1ll*DP(tv,0,u))%yh;
else sum=(sum*1ll*(DP(tv,0,u)+DP(tv,1,u)))%yh;
}
tmp=(tmp+sum)%yh;
}
}
return tmp%yh;
}
int main(){
n=read();
for(int i=1;i<=n;++i) c[i]=read(),cnt+=c[i];
for(int i=1;i<n;++i){
int u=read(),v=read();
in[u]++,in[v]++;
Link(u,v);
Link(v,u);
}
if(in[1]==n-1){
printf("%d\n",(c[1])?1:cnt);
return 0;
}
memset(f,-1,sizeof(f));
Ans=(c[1]==1)?DP(1,0,0):DP(1,1,0);
printf("%lld\n",Ans);
return 0;
}
cut(树形DP)的更多相关文章
- hdu 5452 Minimum Cut 树形dp
Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp
D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...
- HDU5739 Fantasia 树形dp + 点双缩点
这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...
- HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价
Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/ ...
- BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP
题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...
- 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)
洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...
- 【BZOJ2286】消耗战(虚树,DFS序,树形DP)
题意:一棵N个点的树上有若干个关键点,每条边有一个边权,现在要将这些关键点到1的路径全部切断,切断一条边的代价就是边权. 共有M组询问,每组询问有k[i]个关键点,对于每组询问求出完成任务的最小代价. ...
- LuoGu-P1122 最大子树和+树形dp入门
传送门 题意:在一个树上,每个加点都有一个值,求最大的子树和. 思路:据说是树形dp入门. 用dfs,跑一边,回溯的时候求和,若和为负数,则减掉,下次不记录这个节点. #include <ios ...
- 【题解】hdu 3586 Information Disturbing 二分 树形dp
题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...
随机推荐
- java字符串与二进制的相互转化
public class StrBinaryTurn { // 将Unicode字符串转换成bool型数组 public boolean[] StrToBool(String input) { boo ...
- @property的4类修饰符
一.读写性修饰符:readwrite | readonly readwrite:表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法. readonly:表明这个属性只能读 ...
- Java并发编程的艺术,解读并发编程的优缺点
并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...
- window mysql5.7 zip 安装
第一步 ? 1 2 3 4 5 6 7 8 9 10 11 12 my-default.ini 添加配置: #绑定IPv4和3306端 bind-address = 127.0.0.1 port = ...
- jQuery遍历Table表格的行和列
遍历Table表格的行和列,在开发中比较常用的功能,特别是前端开发人员,不多说,直接上代码,下面代码只是弹出第一列字段,请各位自己根据需求修改和扩展! <!DOCTYPE html PUBLIC ...
- Android各大手机系统打开权限管理页面
最近项目上比较忙,终于有空闲时间写写东西了. 相信做过Android的都知道,现在的手机系统五花八门,当我们去请求用户的权限的时候,总是会弹出是否允许的对话框. 而且用户一旦不小心点了拒绝,下次就不再 ...
- VS中生成网站和发布网站的区别
VS中生成网站和发布网站的区别 生成网站:是网站项目的编译. 我们知道像一样的C#编译性语言,在运行程序的时候,首先都要经过编译成计算机识别的二进制代码,才能运行.还有网站编译后,浏览 ...
- Eucalyptus镜像管理
1.前言 Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...
- Jscript 命名规范
变量命名都以类型前缀+有意义的单词组成,用驼峰式命名法增加变量和函式的可读性.例如:sUserName,nCount. 前缀规范:每个局部变量都需要有一个类型前缀,按照类型可以分为:s:表示字符串.例 ...
- linux设置history历史记录
#说明export HISTSIZE=1000 #设置历史记录显示1000行export HISTTIMEFORMAT='%F %T ' #设置历史记录格式 999 2017-08-15 10:58: ...