【bzoj4011】落忆枫音

Description

给出一个有n个点和m条边的有向无环图,1号节点入度为0。这个有向无环图存在一个树形子图,是以1号节点为根的包含全部n个点的一棵树。该树形子图可能有多种可能性。

现在向图中加入一条与已有边不同的有向边(连接两个节点但方向不同视为不同的边),这条边可连向自身。原有向无环图添加新边后得到的新图可能会出现环。

求新图中以1为根的树形子图的方案数。(对1000000007取模)


Solution

我们可以得到,有向无环图中树形子图的方案数为2号节点到n号节点的入度的乘积。

设新边为(u,v),新图中2号节点到n号节点的入度的乘积为sum。

若v==1,则答案为sum。

否则令f[i]表示原图中1号节点到i号节点所有路径的价值之和除以该点当前入度,ans=sum-f[u]。

初始值:f[v]=sum。

我们在原图中从1号节点开始进行拓扑排序。

若加入新边后不构成环,由于原图为DAG,则不存在从v节点到u节点的路径,f[u]=0,满足答案为2号节点到n号节点的入度的乘积,即ans=sum;

若加入新边后构成环,f[u]的值即新图中取了整个环的方案数,则ans=sum-f[u]。

Code

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 typedef long long ll;
 7 const ll mod=1000000007;
 8 struct edge{
 9     int to,next;
10 }e[200010];
11 int n,m,x,y,head[100010];
12 int a[100010]={0},in[100010]={0};
13 ll ans=1,inv[100010]={0,1},f[100010]={0};
14 ll solve(){
15     queue<int>q;
16     while(!q.empty())
17         q.pop();
18     q.push(1);
19     f[y]=ans;
20     while(!q.empty()){
21         int u=q.front();
22         q.pop();
23         f[u]=f[u]*inv[a[u]]%mod;
24         for(int i=head[u];~i;i=e[i].next){
25             int v=e[i].to;
26             f[v]=(f[v]+f[u])%mod;
27             in[v]--;
28             if(in[v]==0)
29                 q.push(v);
30         }
31     }
32     return (ans-f[x]+mod)%mod;
33 }
34 int main(){
35     memset(head,-1,sizeof(head));
36     scanf("%d%d%d%d",&n,&m,&x,&y);
37     for(int i=2;i<=n+1;i++)
38         inv[i]=(mod-mod/i*inv[mod%i]%mod)%mod;
39     a[y]++;
40     for(int i=1;i<=m;i++){
41         int u,v;
42         scanf("%d%d",&u,&v);
43         e[i]=(edge){v,head[u]};
44         head[u]=i;
45         in[v]++;a[v]++;
46     }
47     for(int i=2;i<=n;i++)
48         ans=ans*a[i]%mod;
49     printf("%lld\n",y==1?ans:solve());
50     return 0;
51 }

原文地址:https://www.cnblogs.com/gzez181027/p/bzoj4011.html

时间: 2024-08-29 22:02:53

【bzoj4011】落忆枫音的相关文章

BZOJ 4011: [HNOI2015]落忆枫音( dp )

DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long l

【BZOJ 4011】 [HNOI2015]落忆枫音

4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 244 Solved: 137 [Submit][Status][Discuss] Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑.

【BZOJ】【4011】【HNOI2015】落忆枫音

拓扑排序+DP 题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103 http://www.cnblogs.com/mmlz/p/4448742.html 通过转化……路径外的$degree_i$的乘积转化成所有点的degree之积除以路径内的,所以用到逆元…… PoPoQQQ的线性筛逆元好神奇啊……>_< OrzOrz 1 /******************************************************

【bzoj4011 hnoi2015】落忆枫音

题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再见到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说,枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的.枫树的灵魂流过每片枫叶

BZOJ4011 [HNOI2015]落忆枫音

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回

[HNOI 2015]落忆枫音

Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说, 枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的. 枫树的灵

[HNOI2015] 落忆枫音

题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再见到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说,枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的.枫树的灵魂流过每片枫叶

【BZOJ4011】【HNOI2015】落忆枫音 拓扑图DP,

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45362029"); } 题解: 如果没有后加的边,那么 ans=∏ni=2di ,可以回忆构建树形数据的普遍方法--点 i 连一条 [1,i-1] 的边即可. 然后后加边了以后,有且仅有一些方案会形成环是错误方案. 拓扑图DP就好啦

luogu3244 bzoj4011 HNOI2015 落忆枫音

这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入度,现在新加入一条不重复的边,使得它可能有环.求它的生成子图个数,使得子图正好包含N-1条边且1号点与其它的所有点连通. 题目分析: 我们首先要发现这是一个树的结构!有向的树. 分析树的特点,树的父亲只有一个,我们不妨从这里入手. 在这一个生成子图中,谁是谁的父亲? 我们知道1号点一定是root,这