bzoj4011 HNOI2015 落憶楓音

2021-08-15 05:14:04 字數 3957 閱讀 7354

(

description

「恆逸,你相信靈魂的存在嗎?」

郭恆逸和姚楓茜漫步在楓音鄉的街道上。望著漫天飛舞的紅楓,楓茜突然問出

這樣乙個問題。

「相信吧。不然我們是什麼,一團肉嗎?要不是有靈魂……我們也不可能再見

到你姐姐吧。」

恆逸給出了乙個略微無厘頭的回答。楓茜聽後笑了笑。

「那你仔細觀察過楓葉嗎?」

說罷,楓茜伸手,接住了一片飄落的楓葉。

「其實每一片楓葉都是有靈魂的。你看,楓葉上不是有這麼多脈絡嗎?我聽說,

楓葉上有一些特殊的位置,就和人的穴位一樣。脈絡都是連線在這些穴位之間的。

楓樹的靈魂流過每片楓葉的根部,沿著這些脈絡,慢慢漫進穴位,沁入整片楓葉。

也是因為這個原因,脈絡才都是單向的,靈魂可不能倒著溜回來呢。」

恆逸似懂非懂地點了點頭。楓茜接著說了下去。

「正是因為有了靈魂,每片楓葉才會與眾不同。也正是因為有了靈魂,每片楓

葉也都神似其源本的楓樹,就連脈絡也形成了一棵樹的樣子。但如果仔細看的話,

會發現,在脈絡樹之外,還存在其它的非常細的脈絡。雖然這些脈絡並不在樹上,

但他們的方向也同樣順著靈魂流淌的方向,絕不會出現可能使靈魂倒流的迴路。」

恆逸好像突然想到了什麼。

「那這些脈絡豈不是可以取代已有的脈絡,出現在脈絡樹上?」

楓茜閉上了眼睛。

「是啊,就是這樣。脈絡樹並不是唯一的。只要有一些微小的偏差,脈絡樹就

可能差之萬里,哪怕是在這同一片楓葉上。就像我們的故事,結局也不是唯一的。

只要改變乙個小小的選項,故事流程可能就會被徹底扭轉。」

「真是深奧啊……」

恆逸盯著這片紅楓,若有所思地說。楓茜繼續說道。

「還不止如此呢。所有的脈絡都不會永恆存在,也不會永恆消失。不管是脈絡

樹上的脈絡,還是之外的細小脈絡,都是如此。存在的脈絡可能斷開消失,消失的

脈絡也可能再次連線。萬物皆處在永恆的變化之中,人與人之間的羈絆也是。或許

有一天,我們與大家的羈絆也會如同脈絡一樣,被無情地斬斷。或許我們也終將成

為「楓音鄉的過客」。或許這一切都會是必然,是楓樹的靈魂所決定的……」

楓茜的眼角泛起了幾滴晶瑩剔透的淚珠。恆逸看著這樣的楓茜,將她抱入懷中。

「別這樣想,楓茜。就算脈絡斷開,也有可能還會有新的脈絡樹,也還會與楓

樹的根相連。這樣的話,我們的羈絆仍然存在,只是稍微繞了一些遠路而已。無論

如何,我都不會離開你的。因為你是我窮盡一生所尋找的,我的真戀啊!」

兩人的目光對上了。楓茜幸福地笑了,把頭埋進了恆逸的懷抱。從遠方山上的

楓林中,傳來了楓的聲音。

【問題描述】

不妨假設楓葉上有 n個穴位,穴位的編號為 1 ~ n。有若干條有向的脈絡連線

著這些穴位。穴位和脈絡組成乙個有向無環圖——稱之為脈絡圖(例如圖 1),穴

位的編號使得穴位 1 沒有從其他穴位連向它的脈絡,即穴位 1 只有連出去的脈絡;

由上面的故事可知,這個有向無環圖存在乙個樹形子圖,它是以穴位 1為根的包含

全部n個穴位的一棵樹——稱之為脈絡樹(例如圖 2和圖 3給出的樹都是圖1給出

的脈絡圖的子圖);值得注意的是,脈絡圖中的脈絡樹方案可能有多種可能性,例

如圖2和圖 3就是圖 1給出的脈絡圖的兩個脈絡樹方案。

脈絡樹的形式化定義為:以穴位 r 為根的脈絡樹由楓葉上全部 n個穴位以及 n

- 1 條脈絡組成,脈絡樹里沒有環,亦不存在從乙個穴位連向自身的脈絡,且對於

楓葉上的每個穴位 s,都存在一條唯一的包含於脈絡樹內的脈絡路徑,使得從穴位

r 出發沿著這條路徑可以到達穴位 s。

現在向脈絡圖新增一條與已有脈絡不同的脈絡(注意:連線 2個穴位但方向不

同的脈絡是不同的脈絡,例如從穴位3到4的脈絡與從4到3的脈絡是不同的脈絡,

因此,圖 1 中不能新增從 3 到 4 的脈絡,但可新增從 4 到 3 的脈絡),這條新脈絡

可以是從乙個穴位連向自身的(例如,圖 1 中可新增從 4 到 4 的脈絡)。原脈絡圖

新增這條新脈絡後得到的新脈絡圖可能會出現脈絡構成的環。

請你求出新增了這一條脈絡之後的新脈絡圖的以穴位 1 為根的脈絡樹方案數。

由於方案可能有太多太多,請輸出方案數對 1,000,000,007 取模得到的結果。

input

輸入檔案的第一行包含四個整數 n、m、x和y,依次代表楓葉上的穴位數、脈

絡數,以及要新增的脈絡是從穴位 x連向穴位y的。

接下來 m行,每行兩個整數,由空格隔開,代表一條脈絡。第 i 行的兩個整數

為ui和vi,代表第 i 條脈絡是從穴位 ui連向穴位vi的。

output

輸出一行,為新增了從穴位 x連向穴位 y的脈絡後,楓葉上以穴位 1 為根的脈

絡樹的方案數對 1,000,000,007取模得到的結果。

sample input

4 4 4 3

1 2

1 3

2 4

3 2

sample output

3 hint

對於所有測試資料,1 <= n <= 100000,n - 1 <= m <= min(200000, n(n – 1) / 2),

1 <= x, y, ui, vi <= n。

dag愣是被我建成了雙向邊 然後竟然還過樣例了 果然菜的人就是我

題意:給定m條邊的dag 然後再額外給您一條邊 現在詢問構成以1為根的樹有多少種

那麼直接求外向樹的方法不太可能那麼就只能考慮容斥了 看了題解 說直接套用朱劉演算法的公式

可以知道如果除根節點外每個點都選擇一條入邊 因為沒有環 一定會形成乙個樹形圖 所以假如這沒有我最後新增的邊 我直接把每個節點的入度數一乘即可 但是現在因為有環 所以我直接這樣做算出來的方案是不對的那怎麼辦 得把構成環的方案去除才可以 我考慮了很久 可以想象到我只需要統計我現在是x->y 然後 統計一下y->x的方案數 用總數一減即可 怎麼算可能構成環的這個方案數 就拓撲序dp即可 假設我現在在y 那麼因為我要求是構成環的方案 所以我只能是由那一條邊轉移過來的 所以把我這個點的方案數/入度[y] 然後怎麼轉移就直接轉移累加到下乙個地方 然後整體/下乙個點的入度即可 相當於我又欽定了我走到下乙個點的只能用這條邊 然後算方案數

#include

#include

#define mod 1000000007

#define ll long long

#define n 110000

using namespace std;

inline char gc()

return

*s++;

}inline int

read()

while(ch<='9'&&ch>='0') x=x

*10+ch-'0',ch=gc();

return

x*f;

}struct nodedata[n<<1];

int n,m,xx,yy,q[n],in[n],d[n],num,h[n];ll inv[n],dp[n];

int main()ll ans=1;inv[1]=1;in[yy]++;d[1]=in[1];

for (int i=2;i<=n;++i) inv[i]=inv[mod%i]*(mod-mod/i)%mod;

for (int i=2;i<=n;++i) (ans*=in[i])%=mod,d[i]=in[i];dp[yy]=ans;in[yy]--;

if (xx==yy||yy==1)

int l=1,r=0;for (int i=1;i<=n;++i) if (!in[i]) q[++r]=i;

while(l<=r)

}printf("%lld\n",((ans-dp[xx])%mod+mod)%mod);

return

0;}

BZOJ 4011 HNOI2015 落憶楓音

題意 給乙個有向無環圖,然後叫一條邊,問以1為根的生成樹數量。題面好長啊,出題人真能編故事 先考慮不加那條邊,則麼ans d 2 d 3 d 4 d n d為入度 因為在乙個dag中,只要除根以外的點每個點選一條入邊,就能獲得一棵生成樹。現在考慮加了這條邊,如果再這麼算,就有可能出現環的情況,所以我...

BZOJ4011 HNOI2015 落憶楓音

用脈絡樹總數減去不合法的情況 即樹上有環的情況 拓撲序dp,注意特判連的邊指向1的情況 學到了新姿勢 線性求逆元 原理 假設現在要求a的逆元,x mod a,y mod a ax y 0 ax y a 1 x y 1 ax y 0 ax y a 1 x y 1 code include includ...

BZOJ4011 HNOI2015 落憶楓音

不妨假設楓葉上有 n個穴位,穴位的編號為 1 n。有若干條有向的脈絡連線著這些穴位。穴位和脈絡組成乙個有向無環圖 稱之為脈絡圖 例如圖 1 穴位的編號使得穴位 1 沒有從其他穴位連向它的脈絡,即穴位 1 只有連出去的脈絡 由上面的故事可知,這個有向無環圖存在乙個樹形子圖,它是以穴位 1為根的包含全部...