Hackrank Kingdom Division 树形DP
题目链接:传送门
题意:
给你一棵树,n个点
每个点可以染成红色和蓝色
但是红色的点与其相邻的点中必须有红色节点,蓝色也是
问你有多少种染色的方案
题解:
树形dp
先转化为有根树,取1为根
设定dp[now][red][red] 表示的是当前now节点然red色,其父亲节点染red色的可行方案数
转移很容易想到
- #include<bits/stdc++.h>
- using namespace std;
- #pragma comment(linker, "/STACK:102400000,102400000")
- #define ls i<<1
- #define rs ls | 1
- #define mid ((ll+rr)>>1)
- #define pii pair<int,int>
- #define MP make_pair
- typedef long long LL;
- const long long INF = 1e18+1LL;
- const double Pi = acos(-1.0);
- const int N = 5e5+, M = 1e2+,inf = 2e9;
- const LL mod = 1e9+;
- LL dp[N][][];
- vector<int > G[N];
- int n;
- void dfs(int u,int f) {
- for(int i = ; i < G[u].size(); ++i) {
- int to = G[u][i];
- if(to == f) continue;
- dfs(to,u);
- }
- dp[u][][] = ;
- dp[u][][] = ;
- int ok = ;
- LL ans1= ,ans2 = ;
- for(int i = ; i < G[u].size(); ++i) {
- int to = G[u][i];
- if(to == f) continue;
- ok = ;
- dp[u][][] *= (dp[to][][]+dp[to][][])%mod;
- dp[u][][] %= mod;
- dp[u][][] *= (dp[to][][]+dp[to][][])%mod;
- dp[u][][] %= mod;
- ans1 *= (dp[to][][]) % mod;
- ans1 %= mod;
- ans2 *= (dp[to][][]) % mod;
- ans2 %= mod;
- }
- if(ok) {
- dp[u][][] = (dp[u][][] - ans1 + mod) % mod;
- dp[u][][] = (dp[u][][] - ans2 + mod) % mod;
- }
- }
- int main() {
- scanf("%d",&n);
- for(int i = ; i < n; ++i) {
- int x,y;
- scanf("%d%d",&x,&y);
- G[x].push_back(y);
- G[y].push_back(x);
- }
- dfs(,);
- printf("%lld\n",(dp[][][]+dp[][][]) % mod);
- return ;
- }
Hackrank Kingdom Division 树形DP的更多相关文章
- POJ 3140 Contestants Division 树形DP
Contestants Division Description In the new ACM-ICPC Regional Contest, a special monitoring and su ...
- [poj3140]Contestants Division树形dp
题意:切掉树上的某条边,使分开的两棵树上各点的权值和差值最小. 与hdu2196不同的是,此题是点权,其他无太大差别,注意数据范围. 先求出每个节点的子树权值和,然后自底向上dp即可.取$\min ( ...
- POJ 3140.Contestants Division 基础树形dp
Contestants Division Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10704 Accepted: ...
- 【CF613D】Kingdom and its Cities 虚树+树形DP
[CF613D]Kingdom and its Cities 题意:给你一棵树,每次询问给出k个关键点,问做多干掉多少个非关键点才能使得所有关键点两两不连通. $n,\sum k\le 10^5$ 题 ...
- Codeforces 835 F Roads in the Kingdom(树形dp)
F. Roads in the Kingdom(树形dp) 题意: 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后,保证图还连通时不便利度的最小值 $n & ...
- poj 3140 Contestants Division(树形dp? dfs计数+枚举)
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- POJ 3140 Contestants Division 【树形DP】
<题目链接> 题目大意:给你一棵树,让你找一条边,使得该边的两个端点所对应的两颗子树权值和相差最小,求最小的权值差. 解题分析: 比较基础的树形DP. #include <cstdi ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
随机推荐
- 一篇文章掌握nightwatch自动化测试
nightwatch.js是一个web-ui自动化测试框架,被vue-cli深度整合进来.如果一个项目是基于vue-cli搭建的,基本可以做到开箱即用. 但是我们不可能一直都使用vue-cli.因为它 ...
- 【HIHOCODER 1604】股票价格II(堆)
描述 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 在小Hi的策略中,每天可以在下列三种操作中选取一种: 1.什么也不做: 2.按照当天的价格买进一个单位的 ...
- 【HDU 3037】Saving Beans(卢卡斯模板)
Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...
- Task(TPL)简单的实现Winform(WPF)异步
很多时候,我们要实现Winform异步操作,你可以用传统的方法,但个人感觉代码不好理解,而且使用真有点不舒服.也可以用Task来实现,Task(.net4.0新添加的对象)其实就是对线程池线程的一个封 ...
- POJ 1386 单词接龙问题
题目大意: 给一堆字母,让它们进行接龙,要头对尾能够接的上,问有没有一种方法让所有成语都完成接龙 这道题实际上是在考虑是否存在一条欧拉通路,每个单词产生一条有向线段,由第一个字母指向最后一个字母 这道 ...
- bzoj 2721[Violet 5]樱花 数论
[Violet 5]樱花 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 671 Solved: 395[Submit][Status][Discuss ...
- Android应用的权限配置和权限列表
权限配置写在Mainifest.xml文件中: <?xml version="1.0" encoding="utf-8"?> <manifes ...
- 普通平衡树(bzoj 3224)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- 售货员的难题(codevs 2596)
题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村 ...
- 子串(codevs 4560)
题目描述 Description 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问 ...