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