树形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]