bzoj 4011 HNOI2015 落憶楓音

2021-08-20 13:04:07 字數 1056 閱讀 1708

題意: 給你乙個dag,再給你加一條邊,之後圖不保證是dag了,求新圖中以一為根的生成樹有多少個。

由於原圖是個dag,我們對每個點隨機找爹,總能形成一棵生成樹,那麼答案就是2到n所有點入度的乘積。在加了一條邊 x->y 之後,如果再套用這個公式,無非就是多了加了這條邊之後與一條y->x的路徑構成環的方案。

那麼我們可以對於每一條y->x的路徑考慮,它多貢獻的答案就是除了它以外其他點的入度之積,可以看作又分成了若干個dag。

這樣的話思路就挺明顯了,令dp[i]表示從y出發走到i點對答案多產生的貢獻,令ans為2號點到n號點的乘積,初始dp[y]設定為ans/deg[y],按照圖的拓撲序進行轉移,走到每乙個新點就相當於把這個點加入從y出發的路徑,即

dp[nex]+=dp[now]/deg[nex]

這樣求得的dp[x]即為答案。

下附ac**。

#include#include#include#include#define maxn 200005

using namespace std;

typedef long long ll;

const int mod=1e9+7;

int n,m,nx,ny,tot,ans=1;

int head[maxn],nex[maxn],to[maxn];

void add(int x,int y)

int deg[maxn],deg1[maxn],inv[maxn];

void getinv()

}int q[maxn],dp[maxn];

void topologicalsort() }}

int main()

// int ans=1;

for(int i=2;i<=n;i++)

ans=(1ll*ans*deg1[i])%mod;

if(ny==1)

// cout

// cout

printf("%d\n",(ans-dp[nx]+mod)%mod);

}

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