【树形DP】MZOJ_1063_士兵守卫
本题也是这三天来在下写的几篇树形DP之一,但是不知道为什么洛谷上面老是unknown error,。。。直接去了UVa,说我编译错误。。。我在想是不是头文件的原因,于是被逼无奈,交了一道c89的代码。(结果后来还是CE了)
我真他娘是B了狗了。。。
所以,因为测试数据只过了我们学校的OJ(需要注册才可看题),我会担心有可能代码有问题,欢迎大家杀我祭天指正错误。
题目描述[传送门]
Bob特别喜欢战略游戏,但有时他不能尽快找到最优解,所以他就很伤心。现在他又有一个问题,他必须保卫一个中世纪的城市,这个城市的道路形成了一棵树。他需要在树的节点上放最少的士兵来观察所有的边。你能帮助他么?
例如下图就只需要一个士兵放在1号节点。
输入
输入文件soldier.in中有多组数据,每组数据的第一行N表示点的个数。接下来N行每行格式如下
x:(k) a1 a2 … ak(x为点的编号,k为与其相连的子节点个数,a1, a2, …, ak分别为子节点的编号)
输出
样例输入
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)
样例输出
1
2
提示
0 < N<= 1500, 0
<= x < N
于是这是我写的第三篇关于树形DP的博客。我越来越熟悉这个美妙而不失简洁的算法。。。。然而选课你还是做不来hiahiahia
让我们来简化分析一下:
给定一个无向多叉树,一个节点可以影响和它直接连接的节点,那请问需要至少多少个节点才可以使所有节点都被影响?
动规最重要是定义状态,一个好的状态可以让你的程序写起来更加容易。
在这里我们规定:f[u][0/1]用于表示u号节点放士兵或者不放士兵时的最小士兵数。
那这个时候我们就要想状态转移方程了
要是u节点不放士兵,那必须至少有一条与之相邻的点放了士兵,要是放士兵,则可放可不放,很容易得出f[u][0]=f[u][0]+f[v][1];//v为一个与u相邻的点 f[u][1]=min(f[v][1],f[v][0])
并且在最后不要忘了把f[u][1]给++。
这样状态转移和定义出来了,那么答案就是min(f[root][0],f[root][1]);
下面给出完整代码:
#include<bits/stdc++.h>
namespace Jason{
inline void scan(int &x){
int f=;x=;char s=getchar();
while(s<'' || s>''){if(s=='-') f=-;s=getchar();}
while(s>='' && s<=''){x=x*+s-'';s=getchar();}
x*=f;
}
inline void print(int x){
if(x<){putchar('-');x=-x;}
if(x>)print(x/);char s=x%+'';
putchar(s);
}
struct Edge_B{
int to,dis;
Edge_B* nxt;
Edge_B(int to=-,int dis=-,Edge_B* n=NULL){this->to=to,this->dis=dis,this->nxt=n;}
};
}
using namespace std;
using namespace Jason;
const int maxn=+;
//--------------------
int n,m,cnt=;
struct Edge{
int to,nxt;
}edge[maxn<<];int head[maxn];
int f[maxn][];
//--------------------
void add(int x,int y)
{
edge[++cnt].nxt=head[x];
edge[cnt].to=y;
head[x]=cnt;
} void dp(int u,int fa)
{
for(int i=head[u];i!=-;i=edge[i].nxt)
{
int v=edge[i].to;
if(v==fa) continue;
dp(v,u);
f[u][]+=f[v][];
f[u][]+=min(f[v][],f[v][]);
}
f[u][]++;
} int main()
{
//freopen("in","r",stdin);
int a,b,c;
while(scanf("%d",&n)==)
{
memset(head,-,sizeof(head));
memset(f,,sizeof(f));
for(int i=;i<n;++i)
{
scanf("%d:(%d)",&a,&b);
for(int i=;i<b;++i) scanf("%d",&c),add(a,c),add(c,a);
}
dp(,-);
print(min(f[][],f[][]));putchar('\n');
}
return ;
}
然而我还是不会选课。。。。。
【树形DP】MZOJ_1063_士兵守卫的更多相关文章
- BZOJ 2314: 士兵的放置( 树形dp )
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...
- 【BZOJ2314】士兵的放置 树形DP
[BZOJ2314]士兵的放置 Description 八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了.老大决定加强安保,现在如果在某个房间中放一个士 ...
- BZOJ 4557 JLOI2016 侦查守卫 树形dp
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给 ...
- uva 1292 树形dp
UVA 1292 - Strategic game 守卫城市,城市由n个点和n-1条边组成的树,要求在点上安排士兵,守卫与点相连的边.问最少要安排多少士兵. 典型的树形dp.每一个点有两个状态: dp ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- HDU 1011 Starship Troopers 树形DP 有坑点
本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...
- HDU 1054 Strategic Game (树形dp)
题目链接 题意: 给一颗树,用最少的点覆盖整棵树. 每一个结点可以防守相邻的一个边,求最少的点防守所有的边. 分析: 1:以当前节点为根节点,在该节点排士兵守护道路的最小消耗.在这种情况下,他的子节点 ...
- POJ1463:Strategic game(树形DP)
Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...
- 树形dp专辑
hdu 2196 http://acm.hdu.edu.cn/showproblem.php?pid=2196 input 5//5个结点 1 1//表示结点2到结点1有一条权值为1的边 2 1//表 ...
随机推荐
- listview的pushBackDefaultItem中的item属性被修改问题
time:2015/05/04 1. 描述 在cocostudio中有两个控件,一个listview,另外一个是隐藏的imageview,其中后者作为listview的元素.每次使用的时候把Image ...
- VS编译报错Error2019
1.对项目右键,属性,链接器,常规,附加库目录,查看lib的路径是否填全了,写对了. 2.是否对项目添加引用.
- Linux NFS 详解
目录: 1.了解NFS服务 2.NFS主要文件 3.NFS安装 4.NFS配置 5.NFS客户端配置 6.固定NFS端口 7.Windows挂 ...
- java.lang.UnsatisfiedLinkError: /usr/openv/java/jre/lib/amd64/libawt_xawt.so: libXtst.so.6: cannot open shared object file: No such file or directory
解决办法: 在radhat 或者centos系统中运行一下命令即可:yum install libXext.x86_64yum install libXrender.x86_64yum install ...
- Python中根据提供的日期,返回是一年中的第几天
# coding = utf-8 import datetime dd = raw_input("Please enter date , format is YYYYMMDD:") ...
- svg压缩工具svgo安装使用
svgo是基于node.js的插件,所以需要先安装node.js 1.安装完node.js后,打开node.js命令窗口,输入npm install -g svgo,安装成后会出现下边的内容 2.对s ...
- NSLayoutConstraint
NSLayoutConstraint:定义了UI属性有参照关系的两个UI元素,一个元素的frame变化时,另一个元素变化的规则:依赖依附于最近的共同父视图,包含参照元素本身. 首要:确定变化参考物: ...
- Mysql分区表及自动创建分区Partition
Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键 CREATE TABLE `test1` ( `id` char(32) COLLATE utf8mb4_unicode_ci NO ...
- [HNOI2010]公交线路
题目 发现\(n\)比较大,但是\(k,p\)都很小,考虑矩乘使得复杂度倾斜一下 发现所有车的最大间隔都是\(p\),还保证\(k<p\),于是我们可以考虑压下最后\(p\)位的情况 于是设\( ...
- 20165302 学习基础和C语言基础调查
学习基础和C语言基础调查 ====== 一,技能学习经验体会 要问我有什么技能比大多数人强,这个我还真的不敢说,虽然我在很多方面都有自己的一些了解,比如乐器和绘画,但也都是一知半解,并没有在某一方面出 ...