思路**
題目背景
bob 喜歡玩電腦遊戲,特別是戰略遊戲。但是他經常無法找到快速玩過遊戲的辦法。現在他有個問題。
題目描述
他要建立乙個古城堡,城堡中的路形成一棵無根樹。他要在這棵樹的結點上放置最少數目的士兵,使得這些士兵能瞭望到所有的路。注意,某個士兵在乙個結點上時,與該結點相連的所有邊將都可以被瞭望到。
請你編一程式,給定一樹,幫 bob 計算出他需要放置最少的士兵。
輸入格式
第一行乙個整數n
nn,表示樹中結點的數目。
第二行至第 n+1
n+1n+
1行,每行描述每個結點資訊,依次為:乙個整數 i
ii,代表該結點標號,乙個自然數 k
kk,代表後面有 k
kk 條無向邊與結點i
ii相連。接下來k
kk個整數,分別是每條邊的另乙個結點標號 r1,
r2,.
..,r
k−1,
rk
r_1,r_2,...,r_,r_k
r1,r2
,..
.,rk
−1,
rk表示i
ii與這些點間各有一條無向邊相連。
對於乙個n
nn個結點的樹,結點標號在0
00到n−1
n-1n−
1之間,在輸入資料中每條邊只出現一次。保證輸入是一棵樹。
輸出格式
輸出檔案僅包含乙個整數,為所求的最少的士兵數目。
樣例輸入
4
0 1 1
1 2 2 3
2 03 0
樣例輸出1
說明/提示
資料規模與約定
對於全部的測試點,保證 1≤n
≤1500
1 \leq n \leq 1500
1≤n≤15
00。設當前點的狀態為f[u
][z]
f[u][z]
f[u][z
],即為當前最優值。
當z =0
z=0z=
0不加邊則為dp[
u][0
].
dp[u][0].
dp[u][
0].當z=1
z=1z=
1加邊則為dp[
u][1
].
dp[u][1].
dp[u][
1].則:
d p[
u][0
]+=d
p[to
][1]
.dp[u][0] += dp[to][1].
dp[u][
0]+=
dp[t
o][1
].d p[
u][1
]+=m
in(d
p[to
][0]
,dp[
to][
1]).
dp[u][1] += min(dp[to][0],dp[to][1]).
dp[u][
1]+=
min(
dp[t
o][0
],dp
[to]
[1])
.
#include
#include
using
namespace std;
vector<
int>edge[
1501];
int n,tmp;
int dp[
1501][
2];void
dfs(
int u,
int fa)
}int
main()
}dfs(0
,-1)
;printf
("%d"
,min
(dp[0]
[0],dp[0]
[1])
);return0;
}
樹形DP 戰略遊戲
鮑勃喜歡玩電腦遊戲,特別是戰略遊戲,但有時他找不到解決問題的方法,這讓他很傷心。現在他有以下問題。他必須保護一座中世紀城市,這條城市的道路構成了一棵樹。每個節點上的士兵可以觀察到所有和這個點相連的邊。他必須在節點上放置最少數量的士兵,以便他們可以觀察到所有的邊。你能幫助他嗎?例如,下面的樹 只需要放...
樹形DP 戰略遊戲
description input 輸入檔案中資料表示一棵樹,描述如下 第一行 n,表示樹中結點的數目。第二行至第n 1行,每行描述每個結點資訊,依次為 該結點標號i,k 後面有k條邊與結點i相連 接下來k個數,分別是每條邊的另乙個結點標號r1,r2,rk。對於乙個n 0 n 1500 個結點的樹,...
戰略遊戲 樹形DP入門)
題目鏈結 here 題目分析 放置哨兵無非兩種情況,放或不放,我們可以用dp i 1 來表示第i個結點放置哨兵,dp i 0 來表示第i個結點不放置哨兵,我們可以從上往下,從左往右來遍歷樹,所以這就用到了樹形dp的知識,我們很容易知道,如果父親結點沒放哨兵,那麼子結點肯定要放置哨兵,如果父親放置了哨...