傳送門:
思路:首先要腦補乙個結論,不考慮新加的邊,樹的個數=π 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為根的包含全部...