洛谷P2607題解

2022-05-12 06:52:55 字數 839 閱讀 7245

想要深入學習樹形dp,我的部落格。

本題的dp模型同 p1352 沒有上司的舞會。本題的難點在於如何把基環樹dp轉化為普通的樹上dp。

考慮斷邊和換根。先找到其中的乙個環,在上面隨意取兩個點, 斷開這兩個點的邊,使其變為一棵普通樹。以其中的一點為樹根做樹形dp,再以另一點為樹根再做一次樹形dp,因為相鄰的兩點不能同時選,所以最後統計一下 \(f(i)(0)\) 與 \(g(j)(0)\) 的最大值即可。

定義 \(f(i)(0/1)\) 為第一次樹形dp的 \(i\) 點的最優解,\(g(i)(0/1)\) 為第二次樹形dp的 \(i\) 點的最優解。$\text $ 為一次基環樹dp的答案。\(\text_\text\) 為基環樹的環上的點的集合。

故一次基環樹dp的答案為:

\[\text=\max\

\]\[(i,j\in \text_\text,i\neq j)

\]下圖為洛谷秋令營的課件講解:

關鍵**如下:

void covertree(int fr)//尋找基環樹 }}

void findcir(int fr,int fa)//尋找基環樹中的環

else if(to!=fa)

}}void dpf(int fr)//以其中的一點為樹根做樹形dp }}

void dpg(int fr)//再以另一點為樹根再做一次樹形dp }}

for(int i=1;i<=n;i++)//呼叫+統計答案

特別注意

洛谷P2607 騎士 樹形dp

思路 首先我們想到可以對相互憎惡的倆個騎士連邊,這樣就得到了乙個圖,有多個連通塊,並且每個連通塊中最多只有乙個環。如果每個連通塊都是一顆樹,那麼這個問題就很簡單 每個節點都是選或者不選。idea1 我想可不可以把這個比樹多一條邊的圖,變成一棵樹來處理,那麼就是要刪掉環上的一條邊。考慮刪掉這條邊 u,...

洛谷P2607 騎士 沒有上司的舞會

題目大意 給定乙個 n 個點的外向樹森林,點有點權。從該樹中選出若干頂點組成乙個集合,滿足任意相鄰的兩個頂點不同時出現在該集合中,求這樣集合中點權和的最大值為多少。題解 與樹相比,該題多了環這個結構。對於環上任意一條邊來說,邊的端點不可能同時被選取,因此,可以選擇環上任意一條邊,將其斷開,答案不變。...

洛谷P2607 ZJOI2008 騎士 題解

題目傳送門 題目大意 每個騎士都有自己的戰鬥力且不能和另乙個特定的騎士同時出征,試問出征的騎士最大總戰鬥力是多少 總戰鬥力等於所有出征的騎士的戰鬥力之和 思考過程 做過洛谷p1352 沒有上司的舞會的同學肯定會覺得這個題和它很想,只不過那個題是n個點n 1條邊的樹,這個題是n個點n條邊的基環樹,多了...