题目链接

戳我

\(Description\)

给一张\(n\)割点\(m\)条边的\(DAG\),保证点\(1\)不存在入边,现在需要在\(DAG\)中加入一条不在原图中的边\((x,y)\),求这个有向图以\(1\)为根的树形图个数对\(1e9+7\)去模的结果

\(n<=100000,m<=200000\)

\(Solution\)

我们首先来看看如果没有\((x,y)\)这一条边的话,在\(DAG\)上的方案数为多少?

\[ans=\prod_{i=1}^{n} vis[i]\]

\(vis\)为,点的入度

至于为什么?乘法原理就好了,很容易证明的.

现在来看看有了\((x,y)\)的限制如何处理?

因为加入了这条边以后可能会存在环,所以不能单单这么算了,我们还应减去不合法的情况.那么不合法情况怎么算呢?

我们还是令:
\[ans=\prod_{i=1}^{n} vis[i]\]

假设现在有一个环,中间的节点为:\(a_1,a_2...a_k\)

则不合法的情况为:
\[\frac{ans}{\prod_{i=1}^kvis[i]}\]

因为除了环的点的入度已经固定以外其他的可以随便选

所以我们可以用\(f[v]\) 记录从\(y\)到\(v\frac{ans}{\prod_{i=1}^k vis[i]}\)的值

转移方程为(存在一条从\(u->v\)的路径):
\[f[u]=\sum f[v]\]

最后的答案就是:

\[\prod_{i=1}^{n} (i==y)?vis[i+1]:vis[i]-f[x]\]

注意一点要建反向边,因为要判断环.

\(Code\)

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int read() {int x=0,f=1;char c=getchar();while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();return x*f;
}
struct node {int to,next;
}a[100010<<1];
int vis[100010],head[100010],cnt,n,m,x,y,u,v,ans=1,sum=1,bj[100010],f[100010];
void add(int x,int y){a[++cnt].to=y,a[cnt].next=head[x],head[x]=cnt;
}
int ksm(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans%mod;
}
int inv(int x){return ksm(x,mod-2)%mod;
}
void dfs(int x){if(bj[x])return ;bj[x]=1;if(x==y){f[x]=sum*inv(vis[x])%mod;return ;}for(int i=head[x];i;i=a[i].next){int v=a[i].to;dfs(v);f[x]=(f[x]+f[v])%mod;}f[x]=f[x]*inv(vis[x])%mod;
}
main(){n=read(),m=read(),x=read(),y=read();for(int i=1;i<=m;i++)u=read(),v=read(),add(v,u),vis[v]++;vis[1]++;for(int i=1;i<=n;i++)sum=sum*vis[i]%mod,(i==y)?ans=ans*(vis[i]+1)%mod:ans=ans*vis[i]%mod;dfs(x);printf("%lld ",(ans-f[x]+mod)%mod);
}

转载于:https://www.cnblogs.com/hbxblog/p/10411426.html

「HNOI 2015」落忆枫音相关推荐

  1. P3244 [HNOI2015]落忆枫音(DAG上的动态规划问题,朱刘定理,乘法逆元)

    P3244 [HNOI2015]落忆枫音 样例太坑了!竟然和题目描述给的图不一样! 题目描述 给定一张有向无环图,这张图满足一个性质:以点1为根节点,保证至少有一棵有向树,连接所有的节点. 现在向这张 ...

  2. [HNOI2015] 落忆枫音

    题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...

  3. Bzoj4011 [HNOI2015]落忆枫音

    Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 983  Solved: 533 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫 ...

  4. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...

  5. [bzoj4011][DP]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...

  6. [HNOI2015]落忆枫音

    题目描述 不妨假设枫叶上有 n个穴位,穴位的编号为 1 ~  n.有若干条有向的脉络连接 着这些穴位.穴位和脉络组成一个有向无环图--称之为脉络图(例如图 1),穴 位的编号使得穴位 1 没有从其他穴 ...

  7. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)

    原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...

  8. luogu3244 bzoj4011 HNOI2015 落忆枫音

    这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...

  9. P3244-[HNOI2015]落忆枫音【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3244 题目大意 给出一个DAG\text{DAG}DAG,保证111可以到达所有点.然后再加入一条边(之后不一定 ...

  10. luogu P3244 [HNOI2015]落忆枫音

    传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i=2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点 ...

最新文章

  1. 在你的代码中使用自定义异常类
  2. 脊回归(Ridge Regression) 岭回归
  3. android,项目,一些教程
  4. 台湾国立大学郭彦甫Matlab教程笔记(10) basic plotting下
  5. Jquery插件入门之Validate插件的简单使用
  6. 计算机应用基础(本)实训任务1,计算机应用基础(本)实训任务1-2.pdf
  7. asp.net html table,在ASP.NET中利用HtmlTable动态创建表格 | 学步园
  8. 软件项目组织管理(二、三)项目管理与信息技术环境、项目管理过程组
  9. 计算差分方程的收敛点_数值计算(五十九)热传导方程组的差分数值求解
  10. php按id获取整条数据库,Ajax取得数据库的json值,想通过id获取对应信息,但是都默认获取第一条了...
  11. python设计模式20-状态模式
  12. 【论文】Awesome Relation Extraction Paper(关系抽取)(PART III)
  13. 可怜的 JavaScript,他们说你很怪异,你知道吗?
  14. 麦亡9什么时候能装鸿蒙系统,距断供不到10天 麒麟9000即将绝版 华为大招来了:不止鸿蒙2.0...
  15. 最全面、最系统的商业计划书指南
  16. GNSS-SINEX文件格式简介
  17. 情感日记:用科学的方法追女孩(转)
  18. postgreSQL安装成功后打开pgadmin4出现错误:Fatal error:The pgAdmin 4 server could not be contacted:
  19. cms三次标记浮动垃圾是如何产生的
  20. python 视频播放 拖动_python + opencv鼠标拖动视频区域裁剪

热门文章

  1. Spring AOP前置通知和后置通知
  2. SQL查看存储过程相关信息
  3. stylus 迭代+插值实现css同类型不同值样式序列
  4. Java代码实现“年-月-日 上午/下午时:分:秒”
  5. Parcelable接口的使用
  6. Sql Server2005 Transact-SQL
  7. GDB使用gdb-stl-views打印STL容器元素
  8. Python 定时任务(apscheduler模块)
  9. 运行uiautomatorviewer.bat报错No suitable Java found
  10. printf_s与printf的异同