推薦乙個博主寫的——關於樹形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 中有一種比較經典的題型 樹上揹包...