本题也是这三天来在下写的几篇树形DP之一,但是不知道为什么洛谷上面老是unknown error,。。。直接去了UVa,说我编译错误。。。我在想是不是头文件的原因,于是被逼无奈,交了一道c89的代码。(结果后来还是CE了)

我真他娘是B了狗了。。。

所以,因为测试数据只过了我们学校的OJ(需要注册才可看题),我会担心有可能代码有问题,欢迎大家杀我祭天指正错误。


题目描述[传送门]

Bob特别喜欢战略游戏,但有时他不能尽快找到最优解,所以他就很伤心。现在他又有一个问题,他必须保卫一个中世纪的城市,这个城市的道路形成了一棵树。他需要在树的节点上放最少的士兵来观察所有的边。你能帮助他么?

例如下图就只需要一个士兵放在1号节点。

输入

输入文件soldier.in中有多组数据,每组数据的第一行N表示点的个数。接下来N行每行格式如下

x:(k) a1 a2 … ak(x为点的编号,k为与其相连的子节点个数,a1, a2, …, ak分别为子节点的编号)

输出

输出文件soldier.out,对于每组数据输出一行一个数,即最少士兵数。

样例输入

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_士兵守卫的更多相关文章

  1. BZOJ 2314: 士兵的放置( 树形dp )

    树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...

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

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

  3. BZOJ 4557 JLOI2016 侦查守卫 树形dp

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给 ...

  4. uva 1292 树形dp

    UVA 1292 - Strategic game 守卫城市,城市由n个点和n-1条边组成的树,要求在点上安排士兵,守卫与点相连的边.问最少要安排多少士兵. 典型的树形dp.每一个点有两个状态: dp ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. HDU 1011 Starship Troopers 树形DP 有坑点

    本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...

  7. HDU 1054 Strategic Game (树形dp)

    题目链接 题意: 给一颗树,用最少的点覆盖整棵树. 每一个结点可以防守相邻的一个边,求最少的点防守所有的边. 分析: 1:以当前节点为根节点,在该节点排士兵守护道路的最小消耗.在这种情况下,他的子节点 ...

  8. POJ1463:Strategic game(树形DP)

    Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...

  9. 树形dp专辑

    hdu 2196 http://acm.hdu.edu.cn/showproblem.php?pid=2196 input 5//5个结点 1 1//表示结点2到结点1有一条权值为1的边 2 1//表 ...

随机推荐

  1. 沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同

    沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同 一.前言 想必大家都有这样的困惑,接触的东西越多却越来越混乱了,这个时候就要进行对比和深入的探讨了,抓住每一个概念背后 ...

  2. scala集合与数据结构

    1.数据结构特点 Scala同时支持可变集合和不可变集合,不可变集合从不可变,可以安全的并发访问. 两个主要的包: 不可变集合:scala.collection.immutable 可变集合: sca ...

  3. KVO 的进一步理解

    这篇文章讲述了KVO的深入理解 http://blog.csdn.net/kesalin/article/details/8194240 对kvo有了更深入的理解 如下连接的文章讲述了kvo接口的一些 ...

  4. SQLAlchemy总结

    SQL相关操作 创建一个test库 create database test; 授权一个用户 grant all privileges on *.* to 'yangjian'@'%' identif ...

  5. css属性之flex属性

    flex属性 规定了弹性元素如何伸长或缩短以适应flex容器中的可用空间.是一个简写属性,可以同时设置flex-grow, flex-shrink, flex-basis三个子属性. /* Basic ...

  6. 环境变量、block、修饰符:block对环境变量的引用和修改需要通过修饰符来限定

    环境变量.block.修饰符:block对环境变量的引用和修改需要通过修饰符来限定. http://www.cnblogs.com/fengmin/p/5816580.html - (NSUInteg ...

  7. 以太网,IP,TCP,UDP数据包分析

    http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 网络层的IP 协议是构成Internet 的基础.IP 协议不保证传 ...

  8. BZOJ2761:[JLOI2011]不重复数字(map)

    Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 ...

  9. Js 中的 this

    Js 中 this 的理解   this 是啥 ? this是 JavaScript 语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用; 随着函数使用场合的不同,this ...

  10. python函数可变参数*args和**kwargs区别

    #*args(元组列表)和**kwargs(字典)的区别 def tuple_test(*args): for i in args: print 'hello'+i s=('xuexi','mili' ...