1. 程式人生 > >【洛谷】P3244 [HNOI2015]落憶楓音

【洛谷】P3244 [HNOI2015]落憶楓音

首先沒有環的方案數是很好求的

根據朱劉演算法的推論,一個 DAG 中存在一個點能夠到達每一個點,那麼每個點都選一條入邊一定能構成一個樹型圖(有向樹)

所以DAG可以直接乘法原理

\prod _{i=2}^{n}du(i)

考慮有環的情況

只要將總方案數減去非法方案數就好了

非法方案數是什麼呢

首次加入的這條邊一定是環上的一條邊,所以一定存在一條或者多條迴路從 t 回到 s

設構造路徑 t 到 u 的方案數為 G(u),那麼 u 的後繼節點 v 的方案數是

G(u)/du(i)

那麼

G(t)=\frac{\prod_{i=2}^{n}du(i)}{du(t)}

G(v)=\sum_{u}^{u->v}\frac{G(u)}{du(v)}

解釋一波柿子 1:由於當前已經在 t,所以 t 的出邊是一定的,所以要除掉 t 的度數

解釋一波柿子 2:由於 v 的入邊的選擇對於每一種方案是一定的,所以要除去 v 的度數,然後加法原理搞定

建反向邊就可以更方便推柿子了