想要深入學習樹形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條邊的基環樹,多了...