Description

传送门

Solution

假如我们的图为DAG图,总方案数ans为每个点的入度In相乘(不算1号点)。(等同于在每个点的入边选一条边,最后一定构成一棵树)。

然而如果加了边x->y后图中带了环,则ans个方案中不合法的方案一定是选择了原DAG图中y->x的路径后又选了额外加的边x->y。

假如说我们找到了某条y->x的路径,则选了这条路径的不合法方案数就为除了该路径上的其他点入度相乘。

考虑在原图上dp。假如原图上存在了一条u->v的路径,dp[u]+=dp[v]*inv(In[v])。边界dp[t]=ans*inv(In[t])。

为了保证当我们处理到v的时候所有与指向u的边已经被处理完毕,dp得按照拓扑序进行。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int mod=1e9+;
ll ksm(ll x,int k)
{
ll re=;
while (k)
{
if (k&) re=re*x%mod;
k>>=;
x=x*x%mod;
}
return re;
} int n,m,s,t,x,y,In[];
struct node{int y,nxt;
}g[];int h[],tot=;
ll ans,inv[];
ll dp[];
queue<int>q;
void bfs()
{
dp[t]=ans*inv[t];
for (int i=;i<=n;i++) if (!In[i]) q.push(i);
while (!q.empty())
{
x=q.front();
q.pop();
for (int i=h[x];i;i=g[i].nxt)
{
In[g[i].y]--;
if (!In[g[i].y]) q.push(g[i].y);
dp[g[i].y]=(dp[g[i].y]+dp[x]*inv[g[i].y]%mod)%mod;
}
}
ans-=dp[s];ans%=mod;if (ans<) ans+=mod;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[i]=node{y,h[x]};h[x]=i;
In[y]++;
}
In[t]++;ans=;
for (int i=;i<=n;i++) inv[i]=ksm(In[i],mod-),ans=ans*In[i]%mod;
if (t==) {cout<<ans;return ;}
In[t]--;
bfs();
cout<<ans;
}

[BZOJ4011][HNOI2015]落忆枫音-[dp乱搞+拓扑排序]的更多相关文章

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

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

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

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

  3. BZOJ4011: [HNOI2015]落忆枫音(dp 乘法原理)

    题意 题目链接 Sol 非常妙的一道题 设\(inder[i]\)表示\(i\)号节点的度数 首先如果是个DAG的话,可以考虑在每个点的入边中选一条边作为树形图上的边,这样\(ans = \prod_ ...

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

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

  5. BZOJ4011: [HNOI2015]落忆枫音

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

  6. BZOJ4011 HNOI2015落忆枫音(动态规划+拓扑排序)

    DAG中每个点选一条入边就可以构成一棵有向树,所以如果没有环答案就是∏degreei. 考虑去掉含环的答案.可以看做把环缩点,剩下的点仍然可以任意选入边.于是去除的方案数即为∏degreei/∏deg ...

  7. bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...

  8. [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP

    其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...

  9. luogu3244 bzoj4011 HNOI2015 落忆枫音

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

随机推荐

  1. 1、关于python第三方工具操作xls和xlsx格式的excel文档选型的吐血经历

    首先,最近看了python的一本书,其中第7章是关于文章操作的,就计划把python操作excel,word,txt,xml,html,json等格式的文档做个总结,并实现一些功能,但是,第一步就要把 ...

  2. python正则二

    在python中,我们可以使用re模块来使用正则表达式. 正则表达式使用\对特殊字符进行转义,因为python本身也是用\作为转义,所以在使用正则的时候会出现这样的情况,'python\\.org', ...

  3. [19/04/28-星期日] GOF23_结构型模式(享元模式)

    一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...

  4. 失败 - 模块“MonitorLoop”打开电源失败。

    启动虚拟机提示以下错误 失败 - 模块“MonitorLoop”打开电源失败. 磁盘空间满了

  5. 小程序采坑之setData

    根据双向绑定当我setData的时候input的值应该改变,但是并没有.而且this.data中的值也没有改变 <input class="weui-input" bindi ...

  6. zabbix 表结构详情(基本)

    zabbix表结构 1.acknowledges 记录告警的确认信息 2.actions 记录了当触发器触发时,需要采用的动作. mysql> desc actions; +---------- ...

  7. 让IIS 7 如同IIS 8 第一次请求不变慢(转载)

    当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是Application Pool重启后,或者站点在长时间没有请求访问后,第一次请求网站反应总是很慢.所以每次网站更新都会给第一个用户带来不好 ...

  8. 并发编程(四)------并发quene

    在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue接口! Con ...

  9. eclipse安装activiti插件

    参考: https://blog.csdn.net/augustaurora/article/details/59618737 https://blog.csdn.net/qq_33547950/ar ...

  10. Apache安装排错

    今天安装一下Apache,发现报错,且在网上没有找到相关解决方法,所以记录一下 安装步骤:将下载好的apache包放置到要放置的目录中,最好是盘根目录下,然后命令行下进入到apache下面的bin目录 ...