bzoj
luogu
首先考慮不加那條邊怎麼做吧。
只要給每個節點擊定乙個父親(1號點除外),那麼這棵樹就可以被唯一確定。很顯然吧。
由於這是乙個\(dag\),所以你不管怎麼選父親節點,都不會出現環。
所以在\(dag\)上的答案就是\(\prod_^du_i\)。(你就當\(du_1=1\)好了)
現在考慮在\(dag\)上加了一條邊,那麼就可能產生若干個環(注意是若干個而不是乙個)。
這時候按照上述的隨便選定父親節點的問題在於,可能選出了乙個環。
那樣就要求這個環上的每一條邊都要被選。
然後不在這個環上的點的父親隨便怎麼選這種方案都是不合法的。
所以對於乙個環\(a_1,a_2...a_k\),需要減去的部分就應該是\(\frac^du_i}^du_}\)。
這個東西在\(dag\)上跑一遍\(dp\)就可以了。
時間複雜度\(o(n+m)\)
#include#include#includeusing namespace std;
int gi()
const int n = 2e5+5;
const int mod = 1e9+7;
int n,m,xx,yy,to[n],nxt[n],head[n],cnt,du[n],f[n],ans=1,sum=1;
void link(int u,int v)
int fastpow(int a,int b)
return res;
}int dfs(int u)
int main()
memset(f,-1,sizeof(f));
ans=(ans-dfs(yy)+mod)%mod;
printf("%d\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為根的包含全部...