BZOJ1040 騎士 基環樹DP

2021-10-07 02:04:24 字數 2407 閱讀 3278

description

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

界的讚揚。最近發生了一件可怕的事情,**的y國發動了一場針對z國的侵略戰爭。戰火綿延五百里,在和平環境

中安逸了數百年的z國又怎能抵擋的住y國的軍隊。於是人們把所有的希望都寄託在了騎士團的身上,就像期待有一

個真龍天子的降生,帶領正義打敗**。騎士團是肯定具有打敗**勢力的能力的,但是騎士們互相之間往往有一

些矛盾。每個騎士都有且僅有乙個自己最厭惡的騎士(當然不是他自己),他是絕對不會與自己最厭惡的人一同出

徵的。戰火綿延,人民生靈塗炭,組織起乙個騎士軍團加入戰鬥刻不容緩!國王交給了你乙個艱鉅的任務,從所有

的騎士中選出乙個騎士軍團,使得軍團內沒有矛盾的兩人(不存在乙個騎士與他最痛恨的人一同被選入騎士軍團的

情況),並且,使得這支騎士軍團最具有戰鬥力。為了描述戰鬥力,我們將騎士按照1至n編號,給每名騎士乙個戰

鬥力的估計,乙個軍團的戰鬥力為所有騎士的戰鬥力總和。

input

第一行包含乙個正整數n,描述騎士團的人數。接下來n行,每行兩個正整數,按順序描述每一名騎士的戰鬥力

和他最痛恨的騎士。

output

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

sample input

310 2

20 3

30 1

sample output

30基環樹:

一顆樹中再新增一條邊就成了基環樹

解法:

如果把每一名騎士和他最痛恨的騎士連邊,實際上就形成了乙個有n個點 n條邊的圖,也就是所謂的基環樹。

這裡可以連無向邊,因為他和他最痛恨的騎士不能同時被選中,可以視為雙向的關係。

如果是一顆樹,那麼就和luogu p1352 沒有上司的舞會 那道入門樹形dp一樣,父親和兒子不能同時被選中,求最大權值和。

但在這裡卻是多出一條邊的樹,也就是樹上有乙個環。

我們可以斷環為鏈,再以斷開的邊的兩個點 (l,

r)

(l,r)

(l,r

) 分別為根節點做樹形dp:

dp[u][0] 代表不取點u其子樹的最大貢獻,dp[u][1] 則代表取點u的最大貢獻

我們以點 l

ll 為根dp一次後,只需要存下dp[l][0], 而dp[l][1] 其實是沒有意義的,因為最優方案可能選中了點 r

rr ,而實際上 l

ll 和 r

rr 不能同時選

所以我們沒有算出取點 l

ll 的最優解,故還需要以點 r

rr 為根dp一次,dp[r][0] 的最優解則考慮了可能取到點 l

ll 的方案,最後的結果就是 max

(dp[

l][0

],dp

[r][

0]

)max(dp[l][0], dp[r][0])

max(dp

[l][

0],d

p[r]

[0])

最後需要注意的是本題沒保證任意兩點連通,所以可能會是個基環森林,我們只需要對每棵基環樹分別求解並累加即可

ps:理論上可能存在重邊,但好像資料水了不考慮也能過

code:

const

int mx =

2e6+7;

int n;

int head[mx]

,cnt;

int val[mx]

;bool vis[mx]

;int l,r,broke;

ll dp[mx][2

];struct edgee[mx*2]

;void

init()

void

add(

int u,

int v)

void

find_c

(int u,

int fa)if(

!vis[v]

)find_c

(v,u)

;else}}

void

dfs(

int u,

int fa)

}int

main()

ll res =0;

for(

int i =

1;i <= n;

++i)

printf

("%lld\n"

, res)

;return0;

}

bzoj 1040 騎士 基環外向樹dp

給出n個點n條邊和每個點的點權,一條邊的兩個斷點不能同時選擇,問最大可以選多少。圖是一張基環外向樹森林 是不是很像舞會啊 就是多了一條邊。所以我們考慮一下對於一棵基環外向樹,拆掉一條在環上的邊,變成一棵樹。在這個樹上以斷邊的乙個斷點為根,跑舞會,就得到了這棵樹的最大值 根選和根不選了兩種 考慮到對於...

BZOJ1040 騎士 環套樹 樹形dp

time limit 10 sec memory limit 162 mb submit 5611 solved 2166 submit status discuss z國的騎士團是乙個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各 界的讚揚。最近發生了一件可怕的事情...

BZOJ 1040 騎士(樹形DP)

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