ZJOI2008 騎士(基環樹 DP)

2022-05-23 22:42:12 字數 1242 閱讀 8846

看似有向邊,其實可以轉化為無向邊。

構成乙個基環森林

但是需要特判一種情況:當有兩個人互相討厭的時候,形成一棵樹,同時有重邊(我的找環做法需要sort判重,可能有更好的方法)

然後把森林裡的每一棵樹或者基環樹dp一下(就是沒有上司的舞會模型,超水),把答案加起來

注意會爆int

做完了

#include #include 

#include

#define re register

#define ll long long

using

namespace

std;

inline

intread()

const

int maxn = 1000005

;struct

edge e[maxn

<< 1

];struct

ee e[maxn];

int cnte = 1

, head[maxn];

inline

void add_edge(int i, int

j) ll f[maxn][2];

intn, val[maxn], huan[maxn], cnt, a, b;

bool

vis[maxn], ishuan[maxn], flag;

void dfs(int u, int

fa)

dfs(v, u);

}}void dp(int u, int

fa)

}ll ans = 0

;bool

cmp(ee x, ee y)

intmain()

sort(e + 1, e + n + 1

, cmp);

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

ll res = 0

;

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

res = 0

; dp(a, b);

res = max(res, f[a][0

]); dp(b, a);

res = max(res, f[b][0

]); ans +=res;

}printf(

"%lld\n

", ans);

return0;

}

ZJOI2008 騎士 基環樹

題意見鏈結。本題較為經典,值得一做。基環外向樹練手好題。如果不考慮環的情況,則就是普通樹形dp,f i 0 1 表示這個點取或不取。對於此題一棵樹只能出現乙個環,我們任意刪去環上的一條邊,即可轉環為樹。對於 u,v 1 u 不取,則以 u 為根dp。2 v 不取,則以 v 為根dp。不需要考慮兩個點...

ZJOI2008 騎士 題解

題面 這道題稍微想一想就會聯想到樹形dp的入門題 沒有上司的舞會 但是再想一想會發現這根本就不是一顆樹,因為它比樹多了一條邊 這時候我們引入乙個新的概念 基環樹 顧名思義 基環樹就是在一顆樹上填一條邊構成的乙個圖 基環樹也叫環套樹 明明更像樹套環 我們在樹上可以做的事情基本都可以在基環樹上實現 比如...

P2607 ZJOI2008 騎士(基環樹)

邊數等於點數,是基環樹。考慮dp,如果是樹的話,轉移方程為dp u 1 選擇u w u dp v 0 v為u的子節點 dp u 0 不選擇u max dp v 0 dp v 1 然後基環樹只要找到環後,斷開環上的一條邊就成了樹。斷開的邊上兩端點不能同時選擇,所以對於每棵基環樹,我們求兩邊dp,分別限...