HNOI2015 落憶楓音

2022-05-09 10:48:12 字數 2077 閱讀 8301

嘟嘟嘟

這題大意就是有乙個dag,然後新增了一條邊,求上有多少種生成樹。

這題想了半天,最後還是寫了暴力。暴力就是\(o(2 ^ mn)\)的那種,還出鍋了幾次:剛開始我不想dfs判斷選出的邊是否構成樹,於是yy了一下,以為只要邊數為\(n - 1\),除了根節點每個點的入度為1且都被訪問過就行了。卻忘了有環的情況:只要是一堆不連通的環就全符合我上述的判斷條件了……最後還是寫了每次建圖跑dfs……

正解好像不是很難……但我就是沒往那個方向想。

首先考慮乙個dag的情況,那答案就是\(\prod _ ^ du[i]\)。因為每乙個點只可能有一條入度,那麼每乙個點有\(du[i]\)種選法,答案就是那個了。

這一步我也想過,但就是沒想出來。這東西看上去感覺挺好理解的,但是自己去想不知為啥就是想不出來……

接下來有環了,那麼我們想辦法把有環的那些方案數減掉即可。

一種比較暴力的想法是這樣的:找出\(t\)到\(s\)的所有路徑(不就相當於找環了嘛),記為\(path\),則要減去的就是\(\sum _ \prod du[i]\)。

暴力顯然不行,於是dp。

令\(dp[i]\)表示從\(t\)到\(i\)的所有路徑的\(\prod du[j]\)之和。則答案減去\(dp[s]\)就好了。

怎麼轉移呢,因為是dag,自然能想到拓撲排序,初始化\(dp[t] = \frac\)轉移就是\(dp[i] = \sum_ \frac\)。因為\(i\)和\(j\)相比路徑上多了乙個節點\(i\),所以要把\(i\)的貢獻除掉。

我剛開始擔心這樣開始從\(t\)轉移拓撲排序進行不下去(樣例就過不去),但後來發現從節點1轉移就好了,因為\(dp[1]\)是0,所以轉移到\(t\)前相當於把dag上環外的邊給去掉了。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 1e5 + 5;

const int maxm = 2e5 + 5;

const ll mod = 1e9 + 7;

inline ll read()

inline void write(ll x)

int n, m, s, t, du[maxn];

struct edge

e[maxm];

int head[maxn], ecnt = -1;

in void addedge(int x, int y)

; head[x] = ecnt;

}in ll inc(ll a, ll b)

in ll quickpow(ll a, ll b)

ll ind[maxn], dp[maxn];

in void topo_sort()

}}int main()

ll ans = du[t] + 1;

for(int i = 2; i <= n; ++i) if(i ^ t) ans = ans * du[i] % mod;

if(s == 1 || t == 1)

ind[t] = quickpow(du[t] + 1, mod - 2);

for(int i = 2; i <= n; ++i) if(i ^ t) ind[i] = quickpow(du[i], mod - 2);

dp[t] = ans * ind[t] % mod;

topo_sort();

write((ans - dp[s] + mod) % mod), enter;

return 0;

}

HNOI2015 落憶楓音

hnoi2015 落憶楓音 首先 原圖是乙個dag 生成樹即為除了根節點以外每個節點隨便選一條入邊組成的 所以生成樹數量 各個點入度乘積 新加入一條邊 分三種情況 1.如果不成環 那麼可以把它放在原來的dag裡計算 2.如果它的終點為1 那麼忽略不計 3.如果它成環的話 假設其中乙個環大小是size...

HNOI2015 落憶楓音

luogu3244 bzoj4011 如果是乙個dag,那麼答案顯然是 prod n deg i 其中 deg i 是點 i 的入度。加上條邊後可能會成環,我們要去掉成環的情況數。考慮乙個環,錯誤的計數只會發生在環上每個點選了自己環上的父親,環外的點隨意。所以對於每個環,多餘的計數是 prod de...

HNOI2015 落憶楓音

恆逸,你相信靈魂的存在嗎?郭恆逸和姚楓茜漫步在楓音鄉的街道上。望著漫天飛舞的紅楓,楓茜突然問出這樣乙個問題。相信吧。不然我們是什麼,一團肉嗎?要不是有靈魂.我們也不可能再見到你姐姐吧。恆逸給出了乙個略微無厘頭的回答。楓茜聽後笑了笑。那你仔細觀察過楓葉嗎?說罷,楓茜伸手,接住了一片飄落的楓葉。其實每一...