树形DP

树形DP

【例题1】MZOJ1063 士兵守卫

http://61.139.95.227:82/problem.php?id=1063

题目描述

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

例如下图就只需要一个士兵放在1号节点。在这里插入图片描述

输入

输入文件中有多组数据,每组数据的第一行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
0 <= x < N

【代码】
#include <bits/stdc++.h>
using namespace std;

const int MAXN=15000+5;
int n,f[MAXN][5];

int size=0;
int head[MAXN];
struct node
{
   
	int u;
	int v;
	int next;
}edge[MAXN<<1];

void add(int u,int v)
{
   
	edge[size].u=u;
	edge[size].v=v;
	edge[size].next=head[u];
	head[u]=size++;
}

inline int read()
{
   
	int X=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') 
	{
   
		X=(X<<1)+(X<<3)+ch-'0';
		ch=getchar();
	}
	return X;
}

void dp(int u,int fa)
{
   
	f[u]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值