ZJOI2017 仙人掌 轉化模型後的簡單樹形dp

2021-07-29 13:19:25 字數 2279 閱讀 6804

給定乙個

n 個點,

m條變的無向無自環的連通圖,問都多少種加邊方案使得加完邊的圖是一幅沒有重邊仙人掌。(即滿足任意一條邊只屬於乙個簡單環中的無向無自環圖的連通圖)

多組資料。∑n

≤5∗10

5 ∑m

≤106

首先討論給定的圖是樹的情況。

**化一)

要求不能有邊存在與兩個簡單環內相當於我們要加入新的邊去覆蓋這個樹,是的每條邊最多被覆蓋一次。

由於每條邊不一定被覆蓋,所以比較麻煩。注意到題目的乙個性質,不能存在重邊,那麼意味著我們可以將原來構出仙人掌中不存在環內的邊視為向原來樹中的父親連了一條邊,這個與原問題是等價的。這樣就有了每條樹邊都要被覆蓋一次的限制。

**化二)

問題就轉化成了有多少種覆蓋方案使得樹上每條邊恰好被覆蓋一次。

這就很好做了,設 f[

i]表示做完以

i 為根的子樹,且沒有路徑可以向上擴充套件。 g[

i]表示做完以

i 為根的子樹,且有路徑可以向上擴充套件。 h[

i]表示有i個點,變成若干個兩個點和乙個點組合的方案數。

轉移就很顯然了。 h[

0]=h

[1]=

1 h[

i]=h

[i−1

]+h[

i−2]

∗(i−

1)(i

>2)

f[i]=(∏

j∈so

n[i]

g[j]

)∗h[

|son

[i]|

] g[

i]=f

[i]+

(∏j∈

son[

i]g[

j])∗

h[|s

on[i

]|−1

]∗|s

on[i

]|(分

i 節點是否為向上覆蓋邊的端點討論)

對於原圖不是樹的情況可以先把原圖不是仙人掌的情況判掉,答案肯定是0。由於原圖的環是不能被任何邊覆蓋的,所以直接把環上的邊刪掉,轉化成若干棵樹即可。

//yxuanwkeith

#include

#include

#include

using

namespace

std;

const

int maxn = 5e5 + 5, maxm = 1e6 + 5;

const

int mo = 998244353;

struct path path[maxn];

int n, m, tim, bel[maxn], deep[maxn], fa[maxn], f[maxn], g[maxn], h[maxn], tag[maxn];

int tot, last[maxn], next[maxm * 2], go[maxm * 2];

bool flag[maxn];

void link(int u, int v)

void dfs(int now, int pre)

bool remake()

for (int i = n; i; i --)

if (!tag[now]) flag[now] = 1;

if (tag[now] > 1) return

printf("0\n"), 0;

}for (int i = 1; i <= n; i ++) last[i] = 0;

tot = 0;

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

if (flag[i] && fa[i]) link(i, fa[i]), link(fa[i], i);

return1;}

void dp(int now, int pre)

g[now] = (1ll * f[now] * h[num] % mo + 1ll * f[now] * h[num - 1] % mo * num % mo) % mo;

f[now] = 1ll * f[now] * h[num] % mo;

}void solve()

if (!remake()) return;

for (int i = 1; i <= n; i ++) flag[i] = 0;

int ans = 1;

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

printf("%d\n", ans);

}int main()

ZJOI2017 仙人掌 題解

給出乙個無重邊無自環的無向連通圖 n 個點 m 條邊 問有多少種再往上加邊的方案,使得新圖是仙人掌。多組資料,n 5e5,m 先要判斷讀入的圖是否是仙人掌。部分分有樹,就先想樹怎麼做。很直觀地設 f i 表示 i 為根的子樹的方案數,g i 表示有一條路要往上走的方案數。不考慮根的匹配的話,那就是兒...

清華集訓2015 靜態仙人掌 仙人掌剖分

毒瘤仙人掌,明明放到樹上一道板題的非要構造到仙人掌上來出題orz orz orz orz orz 在oi的上古時代,流傳著這樣乙個故事 有一天,小w到森林裡遊玩,回來之後跟小v說,我發現好多棵會動的樹耶!小v說,這有什麼好稀奇的,我用手指頭就能維護每棵樹的形態。於是又過了幾天小w到沙漠裡遊玩,回來之...

動態仙人掌(dinosaur

分析 這道題在考場看到我是完全的蒙蔽的,驚人的妄想著能否用資料離散化後的dp來騙分。我果然很菜。好吧,對於我這種菜雞來說,正解似乎有些難想,讓我們考慮從最基本的情況開始考慮。先將所有仙人掌按p為第一關鍵字排序,從左向右掃。這裡我們考慮乙個貪心策略,如果仙人掌兩兩之間距離足夠遠,則仙人掌之間跳躍的最小...