bob喜歡玩電腦遊戲,特別是戰略遊戲。但是他經常無法找到快速玩過遊戲的辦法。現在他有個問題。
他要建立乙個古城堡,城堡中的路形成一棵樹。他要在這棵樹的結點上放置最少數目的士兵,使得這些士兵能瞭望到所有的路。
注意,某個士兵在乙個結點上時,與該結點相連的所有邊將都可以被瞭望到。
請你編一程式,給定一樹,幫bob計算出他需要放置最少的士兵.
輸入格式:
第一行 n,表示樹中結點的數目。
第二行至第n+1行,每行描述每個結點資訊,依次為:該結點標號i,k(後面有k條邊與結點i相連)。
接下來k個數,分別是每條邊的另乙個結點標號r1,r2,...,rk。
對於乙個n(0輸出格式:
輸出檔案僅包含乙個數,為所求的最少的士兵數目。
例如,對於如下圖所示的樹:
0
1 2 3
答案為1(只要乙個士兵在結點1上)。
輸入樣例#1:
40 1 1
1 2 2 3
2 03 0
輸出樣例#1:
1
這道題算是乙個很裸的樹形dp.也很好做.
狀態定義:
f [ x ] [ 1 ] 表示當前這個節點已經被觀察到了.
f [ x ] [ 0 ] 則表示沒有被觀察到了.
於是就是常規的樹形dp.
這道題屬於一類問題: 樹的最大獨立集問題.
但是,通過這道題,有乙個知識點擴充套件:關於圖論其他的一些類似問題
#includeusingnamespace
std;
const
int maxn=2008
;struct
sja[maxn*2
];int
head[maxn],size;
intn,v[maxn];
int f[maxn][2
];void add(int x,int
y)void dfs(int
x) }
}int
main()
}dfs(0);
cout
<0][0],f[0][1])<}
P2016 戰略遊戲 樹形DP
bob喜歡玩電腦遊戲,特別是戰略遊戲。但是他經常無法找到快速玩過遊戲的辦法。現在他有個問題。他要建立乙個古城堡,城堡中的路形成一棵樹。他要在這棵樹的結點上放置最少數目的士兵,使得這些士兵能瞭望到所有的路。注意,某個士兵在乙個結點上時,與該結點相連的所有邊將都可以被瞭望到。請你編一程式,給定一樹,幫b...
洛谷P2016 戰略遊戲 樹形dp
bob喜歡玩電腦遊戲,特別是戰略遊戲。但是他經常無法找到快速玩過遊戲的辦法。現在他有個問題。他要建立乙個古城堡,城堡中的路形成一棵樹。他要在這棵樹的結點上放置最少數目的士兵,使得這些士兵能瞭望到所有的路。注意,某個士兵在乙個結點上時,與該結點相連的所有邊將都可以被瞭望到。請你編一程式,給定一樹,幫b...
P2016 戰略遊戲
樹形dp f u 0 表示 uf u 0 表示u f u 0 表示u 號節點不放士兵,以x為根的子樹需要的最少士兵數。f u 1 表示 uf u 1 表示u f u 1 表示u 號節點放士兵,以x為根的子樹需要的最少士兵數。由於我們定義的是將其完全覆蓋,則我們不需要考慮父親節點,為什麼?當我們已經回...