樹形DP 戰略遊戲 By vibrant72

2021-10-08 04:19:29 字數 2066 閱讀 3867

思路**

題目背景

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的知識,我們很容易知道,如果父親結點沒放哨兵,那麼子結點肯定要放置哨兵,如果父親放置了哨...