bzoj4011 HNOI2015 落憶楓音

2022-08-22 21:54:10 字數 890 閱讀 5729

傳送門:

思路:首先要腦補乙個結論,不考慮新加的邊,樹的個數=π degree[i](i!=1),degree指入度

因為除了根節點,每個點各選一條入邊,就可以組成一棵樹。

現在有了這條邊x->y,我們如果還用入度乘積統計方案,就有可能多計算一些不合法的方案

這些方案都包含了乙個有新邊的環,於是我們就要想辦法減去這一部分。

我們先統計乙個特定的環,不合法的環一定是由一條y->x的路徑+這條邊x->y構成的,那麼我們可以把這個環當乙個點,含這個環的不合法方案數就是

σy->x的不同路徑 π (i不在列舉的路徑上) degree[i]

於是開始dp,設f[i]表示σy->i的不同路徑 π (j不在列舉的路徑上) degree[j]

那麼i的方案數就是所有能一步到i的點j的方案數之和

因為i不在y->j的路徑上,所以會多乘乙個degree[i],除去即可

轉移方程就是f[i]=(σ(j能一步到i)f[j])/degree[i]

y==1時要特判,不然會除0

#include#include#include#includeconst int maxn=100010,maxm=400010,mod=1000000007;

typedef long long ll;

using namespace std;

int n,m,sx,sy,pre[maxm],now[maxn],son[maxm],tot,in[maxn],q[maxm+10],head,tail,deg[maxn];ll ans=1,f[maxn],inv[maxm];

void add(int a,int b)

ll getinv(int a)

void topdp()

} }}int main()

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為根的包含全部...