poj1463 Strategic game【树形DP】
| Time Limit: 2000MS | Memory Limit: 10000K | |
| Total Submissions: 9582 | Accepted: 4516 | 
Description
Your program should find the minimum number of soldiers that Bob has to put for a given tree.
For example for the tree: 
the solution is one soldier ( at the node 1).
Input
- the number of nodes
 - the description of each node in the following format 
node_identifier:(number_of_roads) node_identifier1 node_identifier2 ... node_identifiernumber_of_roads
or
node_identifier:(0) 
The node identifiers are integer numbers between 0 and n-1, for n nodes (0 < n <= 1500);the number_of_roads in each line of input will no more than 10. Every edge appears only once in the input data.
Output
Sample Input
4
0:(1) 1
1:(2) 2 3
2:(0)
3:(0)
5
3:(3) 1 4 2
1:(1) 0
2:(0)
0:(0)
4:(0)
Sample Output
1
2
Source
题意:
给定一棵n个节点的树,如果在一个节点上放上一个士兵,所有与这个节点相连的边都可以被看守。现在希望所有的边都可以被看守,问需要最少放多少士兵。
思路:
比较典型的一个树形DP,我们用dp[i]表示以i为根的子树的最少士兵数。但是我们并不知道i上有没有士兵,转移方程就写不出来。
所以我们给dp再加一维,dp[i][1]表示以i为根并且i上有士兵的子树的最少士兵数,dp[i][0]为i上没有士兵。
那么对于某个节点rt,假设他的所有孩子的dp均已得到。
那么dp[rt][0] = dp[son][1]之和,因为他的每一个孩子都要有一个士兵。
dp[rt][1] = min(dp[son][0], dp[son][1])之和,即他的每一个孩子可以放士兵也可以不放士兵。
随便取一个节点作为树根,最后输出这个节点dp[rt][0],dp[rt][1]的较小值即可。
//#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<map>
#include<set> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; int n;
const int maxn = ;
vector<int>edge[maxn];
int dp[maxn][]; void dfsdp(int rt, int fa)
{
dp[rt][] = ;
dp[rt][] = ;
for(int i = ; i < edge[rt].size(); i++){
int son = edge[rt][i];
if(son == fa)continue;
else dfsdp(son, rt);
dp[rt][] += dp[son][];
dp[rt][] += min(dp[son][], dp[son][]);
} } int main(){ while(scanf("%d", &n) != EOF){
for(int i = ; i <= n; i++){
edge[i].clear();
}
for(int i = ; i <= n; i++){
int u, num;
scanf("%d:(%d)", &u, &num);
for(int j = ; j <= num; j++){
int v;
scanf(" %d", &v);
edge[u + ].push_back(v + );
edge[v + ].push_back(u + );
}
} dfsdp(, );
printf("%d\n", min(dp[][], dp[][]));
}
return ;
}
poj1463 Strategic game【树形DP】的更多相关文章
- poj1463 Strategic game[树形DP]
		
求一棵树每条边都被选上的点覆盖掉的最少选点数. 一条边被覆盖掉,必须他父亲和儿子中选一个..这不就是比NOIP2018D2T3还裸的暴力么.水掉. lyd给的练习题都什么**玩意儿.. code不挂了 ...
 - POJ1463:Strategic game(树形DP)
		
Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...
 - Strategic game树形DP解法(Poj1463,Uva1292)
		
已经写过本题用二分图的做法,见这儿. 本题的图是一棵树,求最小点覆盖也可以用树形DP的做法. 定义状态f[0/1][u]表示以u为根的子树,u选取/不选最少需要选取多少点来覆盖. 显然 f[0][u] ...
 - HDU 1054 Strategic Game (树形dp)
		
题目链接 题意: 给一颗树,用最少的点覆盖整棵树. 每一个结点可以防守相邻的一个边,求最少的点防守所有的边. 分析: 1:以当前节点为根节点,在该节点排士兵守护道路的最小消耗.在这种情况下,他的子节点 ...
 - UVa 1292 - Strategic game (树形dp)
		
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 给定一棵树,选择尽量少的节点,使得每个没有选中的结点至少和一个已选结点相邻. 思路 ...
 - hdu1054 Strategic Game 树形DP
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 思路:树形DP,用二分匹配也能解决 定义dp[root][1],表示以root 为根结点的子树且 ...
 - POJ 1463 Strategic game(树形DP入门)
		
题意: 给定一棵树, 问最少要占据多少个点才能守护所有边 分析: 树形DP枚举每个点放与不放 树形DP: #include<cstdio> #include<iostream> ...
 - Strategic game(树形DP入门)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题目大意:一棵树,要放置哨兵,要求最少放置多少哨兵能监视到所有的结点 题目分析: 放置哨兵无非两 ...
 - Strategic game(POJ 1463 树形DP)
		
Strategic game Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 7490 Accepted: 3483 De ...
 
随机推荐
- (转)YUV420存储格式
			
YUV格式有两大类:planar和packed.对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V.对于packed的YUV格式,每个像素点的Y,U ...
 - jquery中判断选择器,找没找到元素用$().size()==0
			
jquery中判断选择器,找没找到元素用$().size()==0
 - localhost 和 127.0.0.1
			
转自:http://ordinarysky.cn/?p=431localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少 ...
 - 如何用ChemDraw建立多中心结构
			
通过调整ChemDraw多中心机构的连接可绘制有意义的络合物结构,建立中心原子和络合配体后,利用多中心化学键连接上述结构即可.以下内容将具体介绍如何用ChemDraw建立多中心结构. 一.多中心键和多 ...
 - Landpy.ActiveDirecoty,按照Active Record Pattern设计的方便Lib开源发布
			
想方便的操作AD吗,不想记住那么多AD Attribute名称和常量?请使用Landpy.ActiveDirecoty库,按照Active Record Pattern设计的AD Lib已经在Code ...
 - 工作流JBPM_day01:2-HelloWorld
			
工作流JBPM_day01:2-HelloWorld 新建一个java工程Jbpm4.4 拷贝helloworld.jpdl.xml和helloworld.png文件出来压缩成helloworld.z ...
 - Effective C++ Item 15 Provide access to raw resources in resource-managing classes
			
In last two item, I talk about resource-managing using RAII, now comes to the practical part. Often, ...
 - nodejs搭建简单web服务器!!
			
var http = require("http"), url = require("url"), path = require("path" ...
 - 【RF库测试】DateTime库
			
术语说明: 1.Epoch指的是一个特定的时间:1970-01-01 00:00:00 UTC. 2.国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,格式是 'YYYY-MM-DD h ...
 - STM32学习之路之MDK安装篇