BZOJ1040 騎士 環套樹 樹形dp

2021-08-11 07:54:14 字數 2088 閱讀 3283

time limit: 10 sec  

memory limit: 162 mb

submit: 5611  

solved: 2166 [

submit][

status][

discuss]

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

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

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

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

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

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

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

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

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

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

和他最痛恨的騎士。

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

310 2

20 3

30 1

30n ≤ 1 000 000,每名騎士的戰鬥力都是不大於 1 000 000的正整數。

觀察題目可以看出一共有n條無向邊,組成了乙個環套樹的森林

對於每一棵環套樹,我們需要選取其中不相鄰的幾個點,使得權值和最大

假若這是一棵樹,就特別好寫,裸的樹形dp

設f[i][0]表示i號點為根的子樹不選i的最大權值,f[i][1]表示選i的最大權值

如果是環套樹呢?

對於環上相鄰兩點,不能同時選,我們假定一點不選,這條邊的作用就沒有了,就達到了刪邊成樹的目的

所以我們只需取環上一條邊,分類討論就好了

求環可以用並查集

【 這道題告訴我們:

1、環套樹可以通過分類討論拆環成樹轉化為樹上問題

2、求環可以用並查集 】

#include#include#include#include#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define fo(i,x,y) for (int i = (x); i <= (y); i++)

#define redge(u) for (int k = head[u]; k != -1; k = edge[k].next)

using namespace std;

const int maxn = 1000005,maxm = 2000005,inf = 1000000000;

inline int read()

while (c >= 48 && c <= 57)

return out * flag;

}bool vis[maxn][2];

ll f[maxn][2],ans = 0;

int v[maxn],pre[maxn],n,head[maxn],nedge = 0,m = 0,cir[maxn][2];

struct edgeedge[maxm];

inline void build(int u,int v); head[u] = nedge++;

edge[nedge] = (edge); head[v] = nedge++;

}inline int find(int u)

void dfs(int u,int p)

}int main()

else pre[fa] = fb;

} rep(i,m)

cout << ans << endl;

return 0;

}

BZOJ 1040 騎士(樹形DP)

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

BZOJ1040 騎士 基環樹DP

description z國的騎士團是乙個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各 界的讚揚。最近發生了一件可怕的事情,的y國發動了一場針對z國的侵略戰爭。戰火綿延五百里,在和平環境 中安逸了數百年的z國又怎能抵擋的住y國的軍隊。於是人們把所有的希望都寄託在了騎...

bzoj 1040 騎士 基環外向樹dp

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