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)的更多相关文章

  1. hdu 5452 Minimum Cut 树形dp

    Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  2. 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 ...

  3. HDU5739 Fantasia 树形dp + 点双缩点

    这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...

  4. HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价

    Information Disturbing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/ ...

  5. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  6. 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)

    洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...

  7. 【BZOJ2286】消耗战(虚树,DFS序,树形DP)

    题意:一棵N个点的树上有若干个关键点,每条边有一个边权,现在要将这些关键点到1的路径全部切断,切断一条边的代价就是边权. 共有M组询问,每组询问有k[i]个关键点,对于每组询问求出完成任务的最小代价. ...

  8. LuoGu-P1122 最大子树和+树形dp入门

    传送门 题意:在一个树上,每个加点都有一个值,求最大的子树和. 思路:据说是树形dp入门. 用dfs,跑一边,回溯的时候求和,若和为负数,则减掉,下次不记录这个节点. #include <ios ...

  9. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...

随机推荐

  1. ElasticSearch之QueryBuilders

    1.termsQuery A filer for a field based on several terms matching on any of them 翻译过来:基于以下几个方面对其中任何匹配 ...

  2. 项目上传至Github

    到https://github.com/ 注册用户,然后点 Start a project,创建仓库 记住这个 地址. 再去 https://git-scm.com/downloads 下载git 安 ...

  3. Sublime Text插件列表

    本文由 伯乐在线 - 艾凌风 翻译,黄利民 校稿.英文出处:ipestov.com.欢迎加入翻译组. 本文收录了作者辛苦收集的Sublime Text最佳插件,很全. 最佳的Sublime Text ...

  4. java 基础 03 运算符 分支结构 循环结构

    今天内容: (1)运算符 (2)分支结构 (3)循环结构 1运算符 1.1赋值运算符 (1)简单赋值 = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量来覆盖原来的数值. 笔试题: ia == ...

  5. javascript实现多线程提升项目加载速度

    以前大家都认为js是单线程执行的,假如我们要执行一些耗时的操作,比如加载一张很大的图片,我们可能需要一个进度条来让用户进行等待,在等待的过程中,整个js线程会被阻塞,后面的代码不能正常运行,这可能大大 ...

  6. vue实现选中列表功能

    <template> <div> <ul v-for="prop in items"> <dt>{{prop.name}}</ ...

  7. HTML 笔记之 HTML 元素的概念

    HTML 不是编程语言,它是一种标记语言 HTML 中常见的几个名词是 元素. 标签(开始标签和结束标签). 属性. 元素内容 这篇文章将要介绍的是 HTML 元素的概念 元素的概念 例子: < ...

  8. meterpreter > ps

    meterpreter > ps Process List============ PID PPID Name Arch Session User Path --- ---- ---- ---- ...

  9. 网页编辑器CKEditor4.3.1+CKFinder2.4+JW Player6.7(视频播放器)集成

    CKEditor是使用最多的一款在线网页编辑器,不仅好用,而且功能强大.易扩展.浏览器兼容性好.另外,CKEditor网页编辑器经常更新.本程序使用的是最新稳定版CKEditor4.3.1,添加使用了 ...

  10. Jsoup查找dom元素

    package com.open1111.jsoup; import org.apache.http.HttpEntity;import org.apache.http.client.methods. ...