初中oj 1663戰略遊戲 樹型DP

2021-09-29 15:26:35 字數 2141 閱讀 6781

時間限制: 1000 ms

空間限制: 262144 kb 具體限制

請你編一程式,給定一樹,幫bob計算出他需要放置最少的士兵。

輸入檔案中資料表示一棵樹,描述如下:

第一行 n,表示樹中結點的數目。

第二行至第n+1行,每行描述每個結點資訊,依次為:該結點標號i,k(後面有k條邊與結點i相連),接下來k個數,分別是每條邊的另乙個結點標號r1,r2,…,rk。

對於乙個n(0 < n <= 1500)個結點的樹,結點標號在0到n-1之間,在輸入檔案中每條邊只出現一次。

輸出檔案僅包含乙個數,為所求的最少的士兵數目。

例如,對於如右圖所示的樹:

答案為1(只要乙個士兵在結點1上)。

40 1 1

1 2 2 3

2 03 0

【輸入樣例2】strategi.in

3 3 1 4 2

1 1 0

2 00 0

4 0【輸出樣例2】strategi.out

樹型dp…

設狀態我們考慮兩點:

2:保證所有的路要被瞭望到。

先考慮第二點,已知一條路有兩個節點,如果其中乙個節點不選,另乙個節點必須選!所以想到選和不選的情況;設出f[t,0]和f[t,1],易列出方程;

g[gen,0]:=g[gen,0]+g[f[k,1],1]; g[gen,1]:=g[gen,1]+min(g[f[k,1],1],g[f[k,1],0]);

那麼第一點手到擒來!ac!

標程(請勿抄襲):

var

g:array[

0..100000,0.

.1] of longint;

f:array[

0..100000,1.

.2] of longint;

q:array[

0..100000

] of longint;

i,j,k,m,n,o,p,l,s,t,x,y,gen:longint;

procedure insert

(x,y:longint)

;begin

inc(t);

f[t,1]

:=y;

f[t,2]

:=q[x]

; q[x]

:=t;

end;

function min

(a,b:longint)

:longint;

begin

if a(a)else

exit

(b);

end;

procedure dg

(gen:longint)

;var

k:longint;

begin

k:=q[gen]

;while k<

>

0do begin

dg(f[k,1]

);g[gen,0]

:=g[gen,0]

+g[f[k,1]

,1];

g[gen,1]

:=g[gen,1]

+min

(g[f[k,1]

,1],g[f[k,1]

,0])

; k:

=f[k,2]

; end;

inc(g[gen,1]

);end;

begin

readln

(n);

for i:

=1 to n do begin

read

(x);

if i=

1 then gen:

=x;read

(s);

for j:

=1 to s do begin

read

(y);

insert

(x,y)

; end;

end;

dg(gen)

;writeln

(min

(g[gen,0]

,g[gen,1]

));end.

luogu P2016 戰略遊戲 樹型DP

題目描述 bob喜歡玩電腦遊戲,特別是戰略遊戲。但是他經常無法找到快速玩過遊戲的辦法。現在他有個問題。他要建立乙個古城堡,城堡中的路形成一棵樹。他要在這棵樹的結點上放置最少數目的士兵,使得這些士兵能瞭望到所有的路。注意,某個士兵在乙個結點上時,與該結點相連的所有邊將都可以被瞭望到。請你編一程式,給定...

洛谷 P2016 戰略遊戲 (樹型dp)

傳送門 水的一批的樹型dp,看題沒看清以為是用最少關鍵點覆蓋所有點,結果是點覆蓋所有邊 那就是個很簡單的問題了 雖然點覆蓋點也不難,但我還是寫了好久,wa了 設 fi,0 是 i 點不設防,fi,1 是 i 點設防情況下以 i 為根的子樹的最小貢獻。因為如果乙個點不設防,那麼它的所有兒子必須設防來覆...

SDOI2018 戰略遊戲 廣義圓方樹 虛樹

很容易發現一點,題目要我們求的實際上就是我們的新構的樹中的,圓點的個數,所以呢,在這裡我們可以直接通過先利用廣義圓方樹來再求乙個虛樹,我們直接查詢虛樹就可以完成這個要求了。include include include include include include include include ...