链接
\(\text{UVA - 1292 Strategic game}\)
题意
\(\text{Bob}\)在玩一款策略游戏,它需要保卫一个城市,很多道路将城市连起来,整体看起来像一棵树,\(\text{Bob}\)希望放置尽可能少的士兵到一些城市,包围连接这个城市的道路,士兵只能放在城市上即树的节点上,他可以保护与这个节点相邻的边。
输入格式:多组测试样例,每个测试样例的第一行一个整数\(n\),表示城市个数,之后\(n\)行每行输入一个城市的信息x:(number) a1,a2...
,表示与\(x\)城市直接连接的城市有\(number\)个,分别为\(a_1,a_2,...,a_{number}\)
数据范围:\(0\leq n\leq 1500\).
输出格式:输出一行,表示所需要放置的士兵的最小数量。
分析
这是一个比较简单的树形\(dp\)。
对于一棵树的\(x\)节点来说,如果它不放士兵的话,那么它的每一个子节点\(y_i\)都需要放士兵,如果它放士兵的话,那么它的任意一个子节点\(y_i\),可能放士兵也可以不妨士兵。所以我们就得到了动态转移方程: \[\begin{cases}f[u][1]+=\min(f[v][0],f[v][1])\\f[u][0]+=f[v][1] \end{cases}v\in Son(u)\]
\(f[i][1]\)表示在以\(i\)为根的子树中,如果\(i\)节点放士兵,所需要放置的最小士兵数量,\(f[i][0]\)表示在以\(i\)为根的子树中,如果\(i\)节点不放士兵,所需要放置的最小士兵数量;并且开始的时候,\(f[i][1]=1,f[i][0]=0\).
代码
1 |
|