C 樹形DP模板 騎士 浙江省選2008

2021-07-26 05:46:34 字數 1477 閱讀 7678

zjoi2008 day2 t4

z 國的騎士團是乙個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各界的讚揚。

最近發生了一件可怕的事情,**的y國發動了一場針對 z 國的侵略戰爭。戰火綿延五百里,在和平環境中安逸了數百年的z國又怎能抵擋的住 y 國的軍隊。於是人們把所有的希望都寄託在了騎士團的身上,就像期待有乙個真龍天子的降生,帶領正義打敗**。

騎士團是肯定具有打敗**勢力的能力的,但是騎士們互相之間往往有一些矛盾。每個騎士都有且僅有乙個自己最厭惡的騎士(當然不是他自己),他是絕對不會與自己最厭惡的人一同出征的。

戰火綿延,人民生靈塗炭,組織起乙個騎士軍團加入戰鬥刻不容緩!國王交給了你乙個艱鉅的任務,從所有的騎士中選出乙個騎士軍團,使得軍團內沒有矛盾的兩人(不存在乙個騎士與他最痛恨的人一同被選入騎士軍團的情況),並且,使得這支騎士軍團最具有戰鬥力。

為了描述戰鬥力,我們將騎士按照 1 至 n 編號,給每名騎士乙個戰鬥力的估計,乙個軍團的戰鬥力為所有騎士的戰鬥力總和。

輸入第一行包含乙個正整數 n ,描述騎士團的人數。

接下來 n 行,每行兩個正整數,按順序描述每一名騎士的戰鬥力和他最痛恨的騎士。

輸出應包含一行,包含乙個整數,表示你所選出的騎士軍團的戰鬥力。

輸入  [複製]

10 2 

20 3 

30 1

輸出

30

【資料範圍】

對於 30% 的測試資料,滿足:n≤10;

對於 60% 的測試資料,滿足:n≤100;

對於 80% 的測試資料,滿足:n≤10000。

對於 100% 的測試資料,滿足:n≤1000000,每名騎士的戰鬥力都是不大於 1000000 的正整數。

#include#include#include#include#include#includeusing namespace std;

const int n=1e6+3;

int n,tot;

char ch;

int val[n],fa[n],cnt[n],info[n],nxt[n],go[n];

bool vis[n];

long long ans,f[n][2];

inline void sete(const int &y)

inline void dfs(const int &x)

}inline void dp(int x)

} f[rt][1]=val[rt];

for(int k=info[rt];y=go[k],k;k=nxt[k])

f[rt][1]+=f[y][0];

ans+=max(f[rt][0],f[rt][1]);

}int main()

for(int i=1;i<=n;++i)

if(!vis[i]) dp(i);

cout<

騎士(樹形dp)

題意 給你乙個基環樹森林,每個點有乙個權值,一條邊上的兩個節點不能同時選擇。選取任意個節點,求最大權值和 對於每顆基環樹 找環 斷邊 樹形dp 沒有上司的舞會 include include include include include include define maxn 1000005 de...

BZOJ 1040 騎士(樹形DP)

題意 給出乙個圖,只有乙個環。每個點有乙個權值。選出一些點兩兩不相鄰,使得權值最大?思路 1 找到環。dfs,標記訪問,下乙個節點不是父節點但是已被訪問則這條邊就是環上的兩個點。標記這個邊是我們找到的環邊,並將這兩個點的中乙個設定為root,另乙個我們設為node 2 由於root和node不能同時...

洛谷P2607 騎士 樹形dp

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