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

2022-05-20 13:23:53 字數 938 閱讀 6621

題目大意:給定乙個 n 個點的外向樹森林,點有點權。從該樹中選出若干頂點組成乙個集合,滿足任意相鄰的兩個頂點不同時出現在該集合中,求這樣集合中點權和的最大值為多少。

題解:與樹相比,該題多了環這個結構。對於環上任意一條邊來說,邊的端點不可能同時被選取,因此,可以選擇環上任意一條邊,將其斷開,答案不變。這樣就將環的問題轉化成了樹的問題,接著,分別以斷開邊的端點為根,做兩次樹形 dp,將兩個不選根節點的權值最大值取最大加入答案貢獻即可。

另外,需要注意的是,相比較有向圖找環,無向圖由於邊的雙向性,僅僅用 vis[u]=1 進行判斷會掛掉,因此,需要記錄下前一條邊,並保證後一條邊不等於前一條邊才行。這裡不選點是因為兩個點組成的環的情況。

另外,用並查集進行找環也是可以的。

**如下

#include using namespace std;

const int maxn=1e6+10;

inline int read()while(!isdigit(ch));

dowhile(isdigit(ch));

return f*x;

}struct nodee[maxn<<1];

int tot=1,head[maxn];

inline void add_edge(int from,int to),head[from]=tot;

}int n,a,b,edge,val[maxn],vis[maxn];

long long ans,dp[maxn][2];

void read_and_parse()

void find(int u,int pre)

vis[u]=2;

}void dfs(int u,int fa)

}void solve()

printf("%lld\n",ans);

}int main()

洛谷P2607 騎士 樹形dp

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

洛谷P2607題解

想要深入學習樹形dp,我的部落格。本題的dp模型同 p1352 沒有上司的舞會。本題的難點在於如何把基環樹dp轉化為普通的樹上dp。考慮斷邊和換根。先找到其中的乙個環,在上面隨意取兩個點,斷開這兩個點的邊,使其變為一棵普通樹。以其中的一點為樹根做樹形dp,再以另一點為樹根再做一次樹形dp,因為相鄰的...

洛谷 P2607 ZJOI2008 騎士

給出一幅有n個點,n條邊的無向未必聯通圖,每乙個點有乙個權並與另外乙個點相連,對其中一些點進行染色,且相鄰兩點的顏色不能都染,則最大的染色點權值和是多少.這題和 洛谷p1453城市環路 很像,區別就在於它不是連通圖.因而可以先用並查集和vector進行分塊,易證每一塊都是比樹多一條邊的連通圖,每一塊...