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