hdu1054 Strategic Game 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054
思路:树形DP,用二分匹配也能解决
定义dp[root][1],表示以root 为根结点的子树且在root放一个士兵的最优值,那么因为在root已经有士兵了,所以对其孩子来说可以放也可以不放
那么dp[root][1]+=min(dp[son][1],dp[son][0]);
dp[root][0]表示以root为根结点的子树且在root没有放士兵的最优值,那么因为在root没有士兵,所以在其孩子节点一定要放一个士兵,才能保证与其相连的边被观察到,
那么dp[root][0]+=dp[son][1];
最后的答案即为min(dp[0][1],dp[0][0]);(我是以0为整颗树的根节点的);
状态转移方程草写出来以后,实现就比较简单了吧。。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define MAX 1510
int dp[MAX][MAX];
int n;
class node
{
public:
int to;
int next;
};
node edge[MAX*];
int head[MAX];
int vis[MAX];
int tol;
void init()
{
memset(dp,,sizeof(dp));
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
tol=;
}
void Build_Tree(int u,int v)
{
edge[tol].to=v;
edge[tol].next=head[u];
head[u]=tol++; }
void input()
{
int u,v,num;
char c;
for(int k=;k<=n;k++)
{
cin>>u>>c>>c>>num>>c;
for(int i=;i<=num;i++)
{
cin>>v;
Build_Tree(u,v);
Build_Tree(v,u);
}
}
}
void dfs(int root)
{
vis[root]=;
for(int i=head[root];i!=-;i=edge[i].next)
{
if(vis[edge[i].to]) continue;
int son=edge[i].to;
dfs(son); dp[root][]+=dp[son][];
dp[root][]+=min(dp[son][],dp[son][]);
}
dp[root][]+=;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
input();
dfs();
cout<<min(dp[][],dp[][])<<endl;
}
return ;
}
hdu1054 Strategic Game 树形DP的更多相关文章
- POJ1463:Strategic game(树形DP)
Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...
- HDU 1054 Strategic Game (树形dp)
题目链接 题意: 给一颗树,用最少的点覆盖整棵树. 每一个结点可以防守相邻的一个边,求最少的点防守所有的边. 分析: 1:以当前节点为根节点,在该节点排士兵守护道路的最小消耗.在这种情况下,他的子节点 ...
- UVa 1292 - Strategic game (树形dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 给定一棵树,选择尽量少的节点,使得每个没有选中的结点至少和一个已选结点相邻. 思路 ...
- 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树形DP解法(Poj1463,Uva1292)
已经写过本题用二分图的做法,见这儿. 本题的图是一棵树,求最小点覆盖也可以用树形DP的做法. 定义状态f[0/1][u]表示以u为根的子树,u选取/不选最少需要选取多少点来覆盖. 显然 f[0][u] ...
- poj1463 Strategic game[树形DP]
求一棵树每条边都被选上的点覆盖掉的最少选点数. 一条边被覆盖掉,必须他父亲和儿子中选一个..这不就是比NOIP2018D2T3还裸的暴力么.水掉. lyd给的练习题都什么**玩意儿.. code不挂了 ...
- HDU1054 Strategic Game —— 最小点覆盖 or 树形DP
题目链接:https://vjudge.net/problem/HDU-1054 Strategic Game Time Limit: 20000/10000 MS (Java/Others) ...
- hdu1054 树形dp&&二分图
B - Strategic Game Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
随机推荐
- maridb安装审计audit插件
1.下载插件 https://mariadb.com/kb/en/mariadb-audit- plugin/ 比较新的mariadb版本audit插件直接内嵌在版本里,可以直接安装 INSTALL ...
- JS和Flash(AS)相互调用
<!DOCTYPE html> <html> <head> <title>swf</title> <meta charset=&quo ...
- 走入PHP-类与对象
PHP中用class来定义类,用new实例化对象,用extends继承类,不过只能单继承,属性和方法有public.private和protected做访问控制,默认为public,在类里定义常量不需 ...
- 基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)
网格分割算法是三维几何处理算法中的重要算法,具有许多实际应用.[Katz et al. 2003]提出了一种新型的层次化网格分割算法,该算法能够将几何模型沿着凹形区域分割成不同的几何部分,并且可以避免 ...
- Python之路-字符编码&数据类型补充
作业 三级菜单程序 menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{ }, '网易':{ }, 'google':{ } }, '中关村':{ '爱奇艺':{}, '汽车 ...
- 各位Coder看过来
为了丰富博客内容,也为了解决一些实际的问题,现准备出一系列博文,内容为各位回复评论指明需要的知识点,将在近期为你解决并提供还算精要的讲解:评论内容要求 Coder:+需要的技术内容.技术内容不限领域, ...
- grep的用法笔记
1.grep搜索不保护字符串的命令格式如下: #带-v参数 jevan@df ~ grep "agc" -vRn ./
- 体验VS2017的Live Unit Testing
相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是可以在编写代码的时候进行实时的bac ...
- activiti 5.13 使用activiti设置用户组任务的 工作流的角色
1.设置activiti 流程引擎的用户,组别,关系/**在部署流程定义和启动流程实例的中间,设置组任务的办理人,向Activiti表中存放组和用户的信息*/ IdentityService iden ...
- C++命名空间的解释 【转】
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突.在C++中,变量.函数和类都是大量存在的.如果没有命名空间,这些变量.函数.类的名称将都存在于全局命名空间中,会导致很多冲突.比如,如果我 ...