BZOJ 4011 HNOI2015 落憶楓音

2022-05-21 12:42:17 字數 1070 閱讀 6265

首先我們先來考慮一下如果沒有新加入的那條邊,答案怎麼算。

由於這是乙個\(dag\),所以我們給每個點隨便選擇一條入邊,最後一定會構成乙個樹形圖。於是答案就是除\(1\)號點之外所有點的入度之積。

現在新加入了一條邊,如果形成了乙個環並且\(1\)號點不在環上的話,我們給每個點隨便選擇入邊,就可能會出現選出乙個環的情況。

所以,我們需要考慮把這部分答案給掉。令\(s_\)表示\(x\)到\(y\)的任意一條路徑,\(degree_u\)表示點\(u\)的入度,不難發現,我們要減去的答案就是:

\(\sum_}\prod_degree_u\)

然後我們就可以\(dp\)了。令\(f_i\)表示\(\sum_}\prod_degree_u\),那麼轉移就很好轉了。注意邊界是\(f_x\)。

下面貼**:

#include#include#include#include#include#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

#define mod 1000000007

#define maxn 100010

#define maxm 400010

using namespace std;

typedef long long llg;

int n,m,du[maxn];

int head[maxn],next[maxm],to[maxm],tt;

llg f[maxn],ans;

bool vis[maxn];

int getint()

void gi(llg &x)

llg mi(llg a,int b)

return s;

}llg dfs(int u)

int main()

du[y]++; ans=1;

for(int i=2;i<=n;i++) ans*=du[i],gi(ans);

if(y!=1 && x!=1)

printf("%lld\n",ans);

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