看似有向邊,其實可以轉化為無向邊。
構成乙個基環森林
但是需要特判一種情況:當有兩個人互相討厭的時候,形成一棵樹,同時有重邊(我的找環做法需要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,分別限...