[HNOI2015]落忆枫音
生活随笔
收集整理的這篇文章主要介紹了
[HNOI2015]落忆枫音
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
不妨假設(shè)楓葉上有 n個(gè)穴位,穴位的編號(hào)為 1 ~ ?n。有若干條有向的脈絡(luò)連接 著這些穴位。穴位和脈絡(luò)組成一個(gè)有向無環(huán)圖——稱之為脈絡(luò)圖(例如圖 1),穴 位的編號(hào)使得穴位 1 沒有從其他穴位連向它的脈絡(luò),即穴位 1 只有連出去的脈絡(luò); 由上面的故事可知,這個(gè)有向無環(huán)圖存在一個(gè)樹形子圖,它是以穴位 1為根的包含 全部n個(gè)穴位的一棵樹——稱之為脈絡(luò)樹(例如圖 2和圖 3給出的樹都是圖1給出 的脈絡(luò)圖的子圖);值得注意的是,脈絡(luò)圖中的脈絡(luò)樹方案可能有多種可能性,例 如圖2和圖 3就是圖 1給出的脈絡(luò)圖的兩個(gè)脈絡(luò)樹方案。? 脈絡(luò)樹的形式化定義為:以穴位 r 為根的脈絡(luò)樹由楓葉上全部 n個(gè)穴位以及 n - ?1 條脈絡(luò)組成,脈絡(luò)樹里沒有環(huán),亦不存在從一個(gè)穴位連向自身的脈絡(luò),且對于 楓葉上的每個(gè)穴位 s,都存在一條唯一的包含于脈絡(luò)樹內(nèi)的脈絡(luò)路徑,使得從穴位 r 出發(fā)沿著這條路徑可以到達(dá)穴位 s。? 現(xiàn)在向脈絡(luò)圖添加一條與已有脈絡(luò)不同的脈絡(luò)(注意:連接 2個(gè)穴位但方向不 同的脈絡(luò)是不同的脈絡(luò),例如從穴位3到4的脈絡(luò)與從4到3的脈絡(luò)是不同的脈絡(luò), 因此,圖 1 中不能添加從 3 到 4 的脈絡(luò),但可添加從 4 到 3 的脈絡(luò)),這條新脈絡(luò) 可以是從一個(gè)穴位連向自身的(例如,圖 1 中可添加從 4 到 4 的脈絡(luò))。原脈絡(luò)圖 添加這條新脈絡(luò)后得到的新脈絡(luò)圖可能會(huì)出現(xiàn)脈絡(luò)構(gòu)成的環(huán)。? 請你求出添加了這一條脈絡(luò)之后的新脈絡(luò)圖的以穴位 1 為根的脈絡(luò)樹方案數(shù)。 由于方案可能有太多太多,請輸出方案數(shù)對 1,000,000,007 取模得到的結(jié)果。? 題解 如果它是一個(gè)DAG,那么方案數(shù)就是除了根以外的所有點(diǎn)的入度之積。 那么如果有環(huán),需要把所有環(huán)的方案數(shù)減掉。 如果我們枚舉了一個(gè)環(huán),那么這個(gè)環(huán)上所有點(diǎn)的選擇方式已經(jīng)確定,那么其他點(diǎn)的父親可以隨便選,方案數(shù)為Πd[i]/Πd[u],u為環(huán)上的點(diǎn)。 這個(gè)可以用記搜實(shí)現(xiàn)。 注意連向1的邊沒有意義,要判掉。 代碼#include<iostream> #include<cstdio> #define N 100002 using namespace std; typedef long long ll; const int mod=1e9+7; int n,m,tot,head[N],xx,yy; bool vis[N]; ll dp[N],ans=1,du[N]; struct edge{int n,to; }e[N<<1]; inline int rd(){int x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x; } inline ll power(ll x,ll y){ll ans=1;while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans; } inline void add(int u,int v){e[++tot].n=head[u];e[tot].to=v;head[u]=tot; } void dfs(int u){if(vis[u])return;vis[u]=1;if(u==xx){dp[u]=ans*power(du[u],mod-2)%mod;return;}for(int i=head[u];i;i=e[i].n){int v=e[i].to;dfs(v);(dp[u]+=dp[v])%=mod;}dp[u]=dp[u]*power(du[u],mod-2)%mod; } int main(){n=rd();m=rd();xx=rd();yy=rd();int x,y;for(int i=1;i<=m;++i){x=rd();y=rd();add(x,y);du[y]++;}du[yy]++;ans=1;for(int i=1;i<=n;++i)if(du[i])ans=ans*du[i]%mod;if(yy!=1)dfs(yy); cout<<(ans-dp[yy]+mod)%mod;return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/ZH-comld/p/10464461.html
總結(jié)
以上是生活随笔為你收集整理的[HNOI2015]落忆枫音的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鱼翅多少钱啊?
- 下一篇: 三种求全排列方式之比较