題目大意:給定乙個 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進行分塊,易證每一塊都是比樹多一條邊的連通圖,每一塊...