時間限制: 1000 ms請你編一程式,給定一樹,幫bob計算出他需要放置最少的士兵。空間限制: 262144 kb 具體限制
輸入檔案中資料表示一棵樹,描述如下:
第一行 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 ...