樹型DP求樹的最小支配集

2021-08-20 10:40:42 字數 2845 閱讀 8089

樹型dp求樹的最小支配集

定義:

支配集:形式上,支配集可描述如下:給定無向圖g =〈v , e〉,其中v 是大小為n 的點集,e 是邊集,那麼v 的乙個子集s稱為支配集當且僅當對於v - s 中任何乙個點v ,都有s 中的某個定點u , 使得( u , v) ∈e。

最小支配集:對於圖g = (v, e) 來說,最小支配集指的是從 v 中取盡量少的點組成乙個集合, 使得v 中剩餘的點都與取出來的點有邊相連.也就是說,設 v' 是圖的乙個支配集,則對於圖中的任意乙個頂點 u ,要麼屬於集合 v', 要麼與v' 中的頂點相鄰. 在 v' 中除去任何元素後 v' 不再是支配集, 則支配集 v' 是極小支配集.稱g 的所有支配集中頂點個數最少的支配集為最小支配集,最小支配集中的頂點個數稱為支配數.

貪心法(點這裡)

樹型dp:

思路:

首先我們觀察,乙個點被覆蓋只有三種情況:

1.被它自己覆蓋

2.被它的兒子節點覆蓋

3.被它的父親覆蓋

根據以上的分析,我們就可以令f[u][0],f[u][1],f[u][2]分別表示u在上述的三種情況能得到的最小值。

補充:官方解釋:

1):f[i][0],

表示點 i 屬於支配集合,並且以點 i 為根的子樹都被覆蓋了的情況下支配集中所包含最少點的個數.

2):f[i][1],

表示點 i 不屬於支配集合,且以 i 為根的子樹都被覆蓋,且 i 被其中不少於乙個子節點覆蓋的情況下支配集所包含最少點的個數.

3):f[i][2],

表示點 i 不屬於支配集合,且以 i 為根的子樹都被覆蓋,且 i 沒被子節點覆蓋的情況下支配集中所包含最少點的個數.即 i 將被父節點覆蓋.

推導動態規劃方程:

來看簡單點的兩種情況f[u][0]和f[u][2](下面我們均用v來代表u的子節點)

1.f[u][0]

代表的是u點選擇u點進行覆蓋,那麼經過推到我們可得

f[u][0]=minς(f[v][0],f[v][1],f[v][2])

2.而f[u][2]則代表的是u被其父節點覆蓋,這同樣也代表著u不是被選中的點,也就是說u的子節點v的f[v][2]不放入考慮範圍(因為f[v][2]代表的是v被父節點u覆蓋,但u又不選,所以加入會矛盾)

f[u][2]=σmin(f[v][0], f[v][1])

3.f[u][1]

:它代表的是u節點被其子節點覆蓋。

這裡和上面不同,這裡說的覆蓋可以》=1個子節點。

那麼對於f[u][1]來說,它可以從v的哪些狀態得到呢?

經過簡單的思考,我們得出f[u][1]可以從f[v][1]和f[v][0]得到(為什麼不能是f[v][2]呢?前面已經講過了,既然選擇f[u][1]計算,也就意味著u點不被選擇去覆蓋別的點)。但動態規劃方程

f[u][1]=σmin(f[v][0], f[v][1])

這樣不就和f[u][2]一樣了嗎?

但我們會發現乙個問題,這樣寫出的方程在轉移時可能出現問題,就是有一種特殊情況:有可能出現在求和時每乙個v都取的是f[v][1],這也就意味著我們最後求出來的f[u][1]代表的解中u的子節點v都沒有被選擇去覆蓋別的點!,而這與我們對f[u][1]的定義是矛盾的。

怎麼辦呢?我們要用乙個bool型別的變數flag來記錄下f[u][1]是否從f[v][0]這種狀態轉移過來過,如果沒有,則要強制讓乙個從f[v][1]轉移過來的變成從f[v][0]轉移過來,並且還要保證盡量小。

最後的問題是,如何強制呢?我們令乙個變數inc=min(f[v][0]-f[v][1]),那麼如果最後檢查flag標記時若發現f[u][1]沒有從f[v][0]轉移來的歷史記錄,我們就f[u][1]+=inc就可以啦(這就相當於強制讓乙個從f[v][1]轉移過來的變成從f[v][0]轉移過來,並保證了最小),所以最後f[u][1]的狀態轉移方程就是

f[u][1]=σ

min(

f[v][0

],f[v

][1])(

如果u的子節點v中有被選擇的)

f[u][1]=σ

min(

f[v][0

],f[v

][1])+inc(

如果u的子節點v中沒有被選擇的)

inc=

min(

f[v][0

]−f[v

][1])

最後的最後要注意的地方就是最後輸出答案的時候是min(f[1][0],f[1][1]),而不是min(f[1][0],f[1][1],f[1][2])(1就是根節點,肯定不會被其「父節點」覆蓋)

例題:(點這裡)

**模板:

#include#include#include#include#include#include#include#include#include#define inf 0x7fffffff

#define pi acos(-1.0)

#define n 10025

#define mod 2520

#define e 1e-12

using namespace std;

#define n 100005

int f[n][3],n,vis[n];

vectorg[n];

int dp(int u)

{ f[u][0]=1;

f[u][1]=0;

f[u][2]=0;

vis[u]=1;

bool flag=0;

int inc=inf;

for(int i=0;i例題(點這裡)

樹的最小支配集

最小支配集,就是圖中用最少的點覆蓋其它所有點 如果用選a點覆蓋,則與a點相連的點都被覆蓋,大致 就是這樣 有乙個圖g,現在希望在一些點建立控制站,每個控制站能控制與它相臨的點 直接相連 現在希望有選擇的在一些點建立控制站,使得以最小得控制站數,控制所有的點 圖的最小支配集是np 問題,我只會樹的最小...

問題 L 開會 樹的最小支配集

時間限制 1 sec 記憶體限制 128 mb 提交 111 解決 20 提交 狀態 討論版 命題人 admin 題目描述 開會,是對所有人時間的浪費,是對集體的 山區學校的一些學生之間的關係似乎好得有點過頭,以至於傳出了一些 在風紀委員們看來 不好的緋聞。具體地,有n個學生,n 1條緋聞,每條緋聞...

poj 3659 樹形dp(樹上的最小支配集)

題意 求樹的最小支配集。思路 動態規劃。一開始每個點只取了兩個變數,表示在以其為根的子樹中選擇和不選擇該點的最少點數。由一組資料 6個點的路徑 發現了問題,考慮第3個點的時候,如果不選擇此點,那麼第4個點必須要選取,實際上這是不必的。該組資料的最優解是選擇第2和第5個點。dp1 x 表示選擇第x個點...