题目链接

戳我

\(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);
}

「HNOI 2015」落忆枫音的更多相关文章

  1. 【LOJ】#2115. 「HNOI2015」落忆枫音

    题解 如果不加这条边,那么答案是所有点入度的乘积 加上了这条边之后,我们转而统计不合法的方案数 就是相当于统计一条路径从y到x,新图所有点度的乘积除上这条路径所有点的点度乘积 初始化为\(f[y] = ...

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

    DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...

  3. bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)

    4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1125  Solved: 603[Submit][Statu ...

  4. 【BZOJ4011】【HNOI2015】落忆枫音(动态规划)

    [BZOJ4011][HNOI2015]落忆枫音(动态规划) 题面 BZOJ 洛谷 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜 ...

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

    拓扑排序+DP 题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103 http://www.cnblogs.com/mmlz/p/44487 ...

  6. [HNOI2015]落忆枫音 解题报告

    [HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...

  7. 4011: [HNOI2015]落忆枫音

    4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...

  8. BZOJ 4011 【HNOI2015】 落忆枫音

    题目链接:落忆枫音 以下内容参考PoPoQQQ大爷的博客 首先我们先来考虑一下如果没有新加入的那条边,答案怎么算. 由于这是一个\(DAG\),所以我们给每个点随便选择一条入边,最后一定会构成一个树形 ...

  9. [HNOI 2015]落忆枫音

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

随机推荐

  1. Java并发之AQS详解(转)

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  2. bootstrap 的页码显示问题-------------德州

    之前一个小bug,无论上边怎么搜索,下边的页码,不会改变 调整: 1,在mapper中添加计数, 2,找到service,queryPage中添加, 3,关键一部,如果没有会报错:,找不到该列 so, ...

  3. kubenetes dns

    E0228 07:32:28.912833       1 reflector.go:201] k8s.io/dns/pkg/dns/dns.go:147: Failed to list *v1.En ...

  4. centos7的vsftpd的安装和配置

    安装vsftpd的服务器相关软件 安装vsftpd服务器和客户端 sudo yum install ftp vsftpd 安装一个加密工具 sudo yum install libdb-utils.x ...

  5. Blending

    [Blending] Blending is used to make transparent objects. When graphics are rendered, after all shade ...

  6. Nginx 源码完全注释(11)ngx_spinlock

    Nginx 是多进程模式的,一个 master 与多个 workers,一般工作在多核 CPU 上,所以自旋锁就是必须用到的.Nginx 中的自旋锁的定义,位于 ngx_spinlock.c 中,如下 ...

  7. CSS的编写规范

    一.前言 如上图,页面在渲染和画图时,耗时还是比较多的,这就对我们的编写要求愈加严格. 我们有很多方法来减少上图所示的页面加载耗时的,比如 但是更多的还是在于平时的编写规范,我们需要了解浏览器,让他更 ...

  8. Alpha混合

    ShaderLab syntax: Blending 混合 Blending is used to make transparent objects. 混合是用来制作透明物体的. When graph ...

  9. Hibernate一对多操作

    --------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...

  10. solr 基本命令二(权重查找)

    package zr.com.solr.utils; import java.io.IOException; import java.util.HashMap; import java.util.Li ...