樹形dp專題

2022-09-01 08:45:07 字數 1688 閱讀 3054

推薦乙個博主寫的——關於樹形dp中求最小支配集,覆蓋集,獨立集的部落格

他寫的關於樹形dp**的解釋很好懂

雖然還有求重心,樹形揹包什麼的沒講,不過對於我這樣剛入門的人來說應該是夠了

最小支配集——poj3659

題目含義

有1到n個點,給出點兩兩的相鄰關係,這個圖的最小支配集

題目分析

簡單易懂的最小支配集問題,看著鏈結的部落格很快就能寫出來

但部落格沒講一些細節問題

比如說遇到乙個無向圖可以用vis陣列使無向變有向,這樣dfs也只用乙個引數就行了

還有根節點沒有父節點,不能在求最小時加入dp[root][2]

題目**

#include#include

#include

using

namespace

std;

const

int maxn=1e4+7

;const

int inf=0x3f3f3f3f

;struct

nodeedge[maxn

<<1

];int head[maxn],dp[maxn][3

];int

n,a,b,tot;

bool

vis[maxn];

int min3(int a,int b,int

c)void add(int u,int

v)void dfs(int

u)

else}}

if(!exist)

}int

main()

dfs(a);

printf(

"%d\n

",min(dp[a][0],dp[a][1

]));

return0;

}

最小支配集

最小覆蓋集——poj1463

題目含義

給出n個點,以及每個點所相鄰的點,求最小覆蓋集

題目分析

與支配集相比只有兩個狀態,還不用討論,簡單多了

題目**

#include#include

#include

using

namespace

std;

const

int maxn=1e4+7

;const

int inf=0x3f3f3f3f

;struct

nodeedge[maxn

<<1

];int head[maxn],dp[maxn][2

];int

tot,t,n,m,a,root;

char

ch;void add(int u,int

v)void dfs(intu)}

intmain()

if(!i)root=n;

}dfs(root);

printf(

"%d\n

",min(dp[root][0],dp[root][1

]));

}return0;

}

最小覆蓋集

一遍過真是爽啊

樹形dp專題

1.cf 804 c 最大團染色 dfs 題目中有個條件,相同的冰淇淋所在的節點是連通的,這個很重要 那麼我們就對這個樹t進行dfs,同時給g染色就行了 最大團染色xjb寫 2.xidian 1070 樹形dp dp i j 表示以i為根選j個節點的最大值 注意 類似於01揹包那樣逆推,就不會重複選...

( 動態規劃專題 ) 樹形dp

動態規劃專題 樹形dp 直接看例題 p2015 二叉蘋果樹 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3...

動態規劃專題(二) 樹形DP

dp 這東西真的是博大精深啊.樹形 dp 顧名思義,就是在樹上操作的 dp 一般可以用 f i 表示以編號為 i 的節點為根的子樹中的最優解。轉移的時候一般都將資訊由子節點轉移到父親節點,也就是將資訊從下往上轉移。因此,一般樹形 dp 都會採用遞迴的形式。樹形 dp 中有一種比較經典的題型 樹上揹包...