树形dp...

dp(x, 0)表示结点x不放士兵, 由父亲控制;

dp(x, 1)表示结点x不放士兵, 由儿子控制;

dp(x, 2)表示结点x放士兵.

-------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 500009;
const int MOD = 1032992941;
 
struct edge {
int to;
edge* next;
} E[maxn << 1], *pt = E, *head[maxn];
 
void AddEdge(int u, int v) {
pt->to = v; pt->next = head[u]; head[u] = pt++;
}
 
void upd0(ll &x, int t) {
if((x += t) >= MOD) x -= MOD;
}
 
void upd1(ll &x, int t) {
x = x * t % MOD;
}
 
int N;
ll dp[maxn][3], cnt[maxn][3];
 
void init() {
scanf("%d", &N);
for(int i = 1; i < N; i++) {
int u, v;
scanf("%d%d", &u, &v);
AddEdge(--u, --v);
AddEdge(v, u);
}
}
 
void dfs(int x, int fa) {
dp[x][0] = 0; dp[x][1] = maxn; dp[x][2] = 1;
cnt[x][0] = cnt[x][1] = cnt[x][2] = 1;
ll Min, sum;
for(edge* e = head[x]; e; e = e->next) if(e->to != fa) {
dfs(e->to, x);
Min = min(min(dp[e->to][0], dp[e->to][1]), dp[e->to][2]);
sum = 0;
dp[x][2] += Min;
for(int i = 0; i < 3; i++)
if(dp[e->to][i] == Min) upd0(sum, cnt[e->to][i]);
upd1(cnt[x][2], sum);
Min = min(dp[x][1] + min(dp[e->to][1], dp[e->to][2]), dp[x][0] + dp[e->to][2]);
sum = 0;
for(int i = 1; i < 3; i++) 
if(dp[x][1] + dp[e->to][i] == Min) upd0(sum, cnt[e->to][i]);
upd1(cnt[x][1], sum);
if(dp[x][0] + dp[e->to][2] == Min)
upd0(cnt[x][1], ll(cnt[x][0]) * cnt[e->to][2] % MOD);
dp[x][1] = Min;
dp[x][0] += dp[e->to][1];
upd1(cnt[x][0], cnt[e->to][1]);
}
}
 
int main() {
init();
dfs(0, -1);
ll ans = min(dp[0][1], dp[0][2]), sum = 0;
for(int i = 1; i < 3; i++)
if(dp[0][i] == ans) upd0(sum, cnt[0][i]);
printf("%lld\n%lld\n", ans, sum);
return 0;
}

-------------------------------------------------------------------------------------

2314: 士兵的放置

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 114  Solved: 31
[Submit][Status][Discuss]

Description

八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了。老大决定加强安保,现在如果在某个房间中放一个士兵,则这个房间以及所有与这个房间相连的房间都会被控制.现在

老大想知道至少要多少士兵可以控制所有房间.以及有多少种不同的方案数.

Input

第一行一个数字N,代表有N个房间,房间编号从1开始到N.N<=500000,下面将有N-1行,每行两个数,代表这两个房间相连.

Output

第一行输出至少有多少个士兵才可以控制所有房间第二行输出有多少种方案数,方案数会比较大,输出除以1032992941的余数吧.

Sample Input

6
1 2
1 3
1 5
1 4
5 6

Sample Output

2
2

HINT

第一种方案是将士兵放在1号房间及6号房间

第二种方案是将士兵放在1号房间及5号房间

Source

BZOJ 2314: 士兵的放置( 树形dp )的更多相关文章

  1. 【BZOJ2314】士兵的放置 树形DP

    [BZOJ2314]士兵的放置 Description 八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了.老大决定加强安保,现在如果在某个房间中放一个士 ...

  2. BZOJ 2314 士兵的放置(支配集)

    显然是\(DP\). 设\(dp[i][0/1/2]\)代表以i为根且\(i上有士兵放置/i被控制但i上没有士兵/i没有被控制\)的最小代价. \(g[i][0/1/2]\)代表对应的方案数. 然后运 ...

  3. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  4. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  5. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  6. BZOJ 2435 道路修建 NOI2011 树形DP

    一看到这道题觉得很水,打了递归树形DP后RE了一组,后来发现必须非递归(BFS) 递归版本84分: #include<cstdio> #include<cstring> #in ...

  7. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  8. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

  9. BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]

    4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...

随机推荐

  1. C语言入门(5)——运算符与表达式

    C语言中运算符和表达式数量之多,在高级语言中是少见的.正是丰富的运算符和表达式使C语言功能十分完善.这也是C语言的主要特点之一. C语言的表达式由运算符.常量及变量构成.C语言表达式基本遵循一般代数规 ...

  2. poj1862---变形虫(贪心)

    题意:两条虫之间碰在一起,质量变为2*sqrt(m1*m2) 求怎么结合,能使最后的一只虫质量最小 分析:如果让按从大到小的顺序依次结合,可以使大的数被开方的次数最多,得到的结果更小 4 3 2 1 ...

  3. struts漏洞修补过程之S2-016

    Struts漏洞修补过程之S2-016.邪恶的Struts再次现身,这一次是远程执行漏洞.官方建议立即升级到2.3.15.1.真希望这是最后一次漏洞修补.下面是升级步骤. 1.升级到struts2.3 ...

  4. golang 之 defer(统计函数执行时间)

    package main import ( "fmt" "time" ) func sum(a ...int) int { defer trace(" ...

  5. 简单的CSS网页布局--三列布局

    三列布局其实不难,不过要用到position:absolute这个属性,因为这个属性是基于浏览器而言,左右部分各放在左右侧,空出中间一列来实现三列布局. (一)三列布局自适应 <!DOCTYPE ...

  6. VS2012 TFS切换账号登录

    最近要做团队项目,用到的vs2012的tfs代码管理器(win7 +vs2012),切换账号的流程如下: 1.打开控制面板,进入用户账户 2.点击左侧的管理您的凭据,看到自己的TFS服务器的地址,然后 ...

  7. rownum(转载)

    对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...

  8. vim常用命令总结 (转)

      在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format ...

  9. C和C++运算符 (转)

    这里是C和C++语言的运算符列表.所有列出的运算符皆含纳于C++:第三个栏目里的内容也使用C来描述.应当注意的是C不支持运算符重载. 下列运算符在两个语言中都是顺序点(运算符未重载时): && ...

  10. R与数据分析旧笔记(三)不知道取什么题目

    连线图 > a=c(2,3,4,5,6) > b=c(4,7,8,9,12) > plot(a,b,type="l") 多条曲线效果 plot(rain$Toky ...