1. 程式人生 > >求樹的最大獨立集,最小點覆蓋,最小支配集 貪心and樹形dp

求樹的最大獨立集,最小點覆蓋,最小支配集 貪心and樹形dp

www 子節點 最大獨立集 com 倒序 最小支配集 交流 屬於 else

目錄

  • 求樹的最大獨立集,最小點覆蓋,最小支配集
    • 三個定義
    • 貪心解法
    • 樹形DP解法

(有任何問題歡迎留言或私聊&&歡迎交流討論哦


求樹的最大獨立集,最小點覆蓋,最小支配集

三個定義

最大獨立集:

?對一個圖選出盡量多的點組成一個集合,滿足這些點之間沒有邊相連。所有獨立集中,頂點數最多的稱作最大獨立集。

最小點覆蓋:

?對一個圖選出盡量少的點組成一個集合,滿足圖中所有的邊均有端點屬於這個集合。所有覆蓋集中,頂點數最少的稱作最小點覆蓋。

最小支配集:

?對一個圖選出盡量少的點組成一個集合,滿足圖中剩余的點都和集合中的點有邊相連。從集合中出去任何一個點之後若不再是支配集,則此支配集是極小支配集。所有支配集中,頂點數最少的稱作最小支配集。


貪心解法

樹的最大獨立集:

?先求一遍dfs序,倒序遍歷。若此節點未被標記,則將此端點加入獨立集,並標記此節點和其父節點。

樹的最小點覆蓋:

?先求一遍dfs序,倒序遍歷。若此節點及其父節點均未被標記,則將其父節點加入覆蓋集,並標記此節點及其父節點。

樹的最小支配集:

?先求一遍dfs序,倒序遍歷。若此節點未被標記,把其父節點加入支配集(前提是它不在支配集中),然後標記此節點,父節點及其爺爺節點。

樹形DP解法

樹的最大獨立集:

\(dp[i][0]\)表示點i在獨立集中;\(dp[i][1]\)表示點i不在獨立集中
\[ dp[u][0] = 1 + \sum dp[v][1];\dp[u][1] = \sum max(dp[v][0], dp[v][1]); \]

樹的最小點覆蓋:

\(dp[i][0]\)表示點i在點覆蓋集中;\(dp[i][1]\)表示點i不在點覆蓋集中
\[ dp[u][0] = 1 + \sum min(dp[v][0], dp[v][1]);\dp[u][1] = \sum dp[v][0]; \]

樹的最小支配集:

\(dp[i][0]\)表示點i屬於支配集,並且以點i為根的子樹都被覆蓋了的情況下支配集中所包含最少點的個數

\(dp[i][1]\)表示點i不屬於支配集合,且以i為根的子樹都被覆蓋,且i被其中不少於一個子節點覆蓋的情況下支配集所包含最少點的個數

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

\[ dp[u][0] = 1 + \sum min(dp[v][0],dp[v][1],dp[v][2]);\dp[u][2] = \sum dp[v][1];dp[u][2]=min(dp[u][2],INF);\if(dp[v][0]<=dp[v][1]) inc = 0;(if\;0\;always\;0)\else\;inc = min(inc, dp[v][0]-dp[v][1]);\if(u\;no\;son)dp[u][1] = INF;\else\; dp[u][1] = \sum min(dp[v][0],dp[v][1])+inc; \]


參考博文:Ash-ly

求樹的最大獨立集,最小點覆蓋,最小支配集 貪心and樹形dp