問題描述
\(z\) 國的騎士團是乙個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各界的讚揚。最近發生了一件可怕的事情,**的 \(y\) 國發動了一場針對 \(z\) 國的侵略戰爭。
戰火綿延五百里,在和平環境中安逸了數百年的 \(z\) 國又怎能抵擋的住 \(y\) 國的軍隊。於是人們把所有的希望都寄託在了騎士團的身上,就像期待有乙個真龍天子的降生,帶領正義打敗**。騎士團是肯定具有打敗**勢力的能力的,但是騎士們互相之間往往有一些矛盾。每個騎士都有且僅有乙個自己最厭惡的騎士(當然不是他自己),他是絕對不會與自己最厭惡的人一同出征的。
戰火綿延,人民生靈塗炭,組織起乙個騎士軍團加入戰鬥刻不容緩!國王交給了你乙個艱鉅的任務,從所有的騎士中選出乙個騎士軍團,使得軍團內沒有矛盾的兩人(不存在乙個騎士與他最痛恨的人一同被選入騎士軍團的情況),並且,使得這支騎士軍團最具有戰鬥力。為了描述戰鬥力,我們將騎士按照 \(1\) 至 \(n\) 編號,給每名騎士乙個戰鬥力的估計,乙個軍團的戰鬥力為所有騎士的戰鬥力總和。
輸入格式
第一行包含乙個正整數 \(n\),描述騎士團的人數。
接下來 \(n\)行,每行兩個正整數,按順序描述每一名騎士的戰鬥力和他最痛恨的騎士。
輸出格式
應包含一行,包含乙個整數,表示你所選出的騎士軍團的戰鬥力。
輸入樣例
3
10 2
20 3
30 1
輸出樣例30
資料範圍
\(n ≤ 1 000 000\),每名騎士的戰鬥力都是不大於 \(1 000 000\) 的正整數。
題解考慮乙個連通圖,如果是一棵樹,則該問題等價於求樹上的最大獨立集。當然,圖上有可能出現環,根據題意,每個連通圖上只可能出現乙個環,即基環樹。考慮基環樹的情況,可以先找出基環樹上的環,將環上的一條邊斷開,形成一棵樹,對新樹求樹上最大獨立集即可。對於斷開的邊u-v,因為兩個點不能同時選,所以分別考慮u不選的情況和v不選的情況,即f[u][0]和f[v][0]。對每個連通塊分別求一次即可。
**
#includeusing namespace std;
const int n=1000000+6;
vectorg[n];
int n,val[n],vis[n],x,l,r;
bool flag;
long long ans,f[n][2];
void findcircle(int u,int fa)
void find_circle(int u,int fa)else }}
void dfs(int u,int fa)
}int main()
for(int i=1;i<=n;i++)
} printf("%lld",ans);
}
ZJOI2008 騎士 基環樹
題意見鏈結。本題較為經典,值得一做。基環外向樹練手好題。如果不考慮環的情況,則就是普通樹形dp,f i 0 1 表示這個點取或不取。對於此題一棵樹只能出現乙個環,我們任意刪去環上的一條邊,即可轉環為樹。對於 u,v 1 u 不取,則以 u 為根dp。2 v 不取,則以 v 為根dp。不需要考慮兩個點...
BZOJ1040 騎士 基環樹DP
description z國的騎士團是乙個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各 界的讚揚。最近發生了一件可怕的事情,的y國發動了一場針對z國的侵略戰爭。戰火綿延五百里,在和平環境 中安逸了數百年的z國又怎能抵擋的住y國的軍隊。於是人們把所有的希望都寄託在了騎...
ZJOI2008 騎士(基環樹 DP)
看似有向邊,其實可以轉化為無向邊。構成乙個基環森林 但是需要特判一種情況 當有兩個人互相討厭的時候,形成一棵樹,同時有重邊 我的找環做法需要sort判重,可能有更好的方法 然後把森林裡的每一棵樹或者基環樹dp一下 就是沒有上司的舞會模型,超水 把答案加起來 注意會爆int 做完了 include i...