BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序
Description
「恒逸,你相信灵魂的存在吗?」
Input
输入文件的第一行包含四个整数 n、m、x和y,依次代表枫叶上的穴位数、脉
Output
输出一行,为添加了从穴位 x连向穴位 y的脉络后,枫叶上以穴位 1 为根的脉
如果没有那条返祖边,那么答案就是 $\prod_{i=2}^{n}deg(i)$,即除了 $1$ 号点之外所有点的入度之积.
如果加入一条返祖边,可能会形成环,那就要减去那些不合法的部分.
那么假设我们已经确定了一个环 $S$.
那么如果去掉环 $S$,那么方案数就是 $tot-\frac{tot}{\prod_{i\in S}^{}deg(i)}$
即把 $S$ 的贡献除掉,剩下的边随便连.
如果依次枚举每个环的话会很麻烦,不妨令 $f_{i}$ 表示所有从 $t$ 走到 $i$ 的路径的上述答案.
那么最终答案就会是 $tot-f_{s}$.
考虑转移:
考虑 $u\Rightarrow v$,则 $f_{v}=\frac{\sum f_{u}}{deg_{v}}$.
这么转移就行了,就是一个拓扑序 $dp$.
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cstring>
#define N 100005
#define mod 1000000007
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
namespace IO
{
char *p1,*p2,buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {int x = 0, f = 1;char c = nc();while (c < 48) {if (c == '-')f = -1;c = nc();}while (c > 47) {x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();}return x * f;}
};
queue<int>q;
ll qpow(ll base,ll k) { ll tmp=1; for(;k;base=base*base%mod,k>>=1)if(k&1) tmp=tmp*base%mod; return tmp; }
ll inv(int x) { return qpow(x, mod-2); }
ll ans=1;
int n,m,s,t,edges;
int hd[N],nex[N<<1],deg[N],dp[N],tp[N],to[N<<1];
inline void addedge(int u,int v) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; }
inline ll bfs()
{
int i;
dp[t]=ans;
for(i=1;i<=n;++i) if(!tp[i]) q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();
dp[u]=dp[u]*inv(deg[u])%mod;
for(i=hd[u];i;i=nex[i])
{
int v=to[i];
dp[v]=(dp[v]+dp[u])%mod;
--tp[v];
if(!tp[v]) q.push(v);
}
}
return (ans-dp[s]+mod)%mod;
}
int main()
{
using namespace IO;
int i,j;
// setIO("input");
n=rd(),m=rd(),s=rd(),t=rd(),++deg[t];
for(i=1;i<=m;++i)
{
int x=rd(),y=rd();
++deg[y], ++tp[y], addedge(x,y);
}
for(i=2;i<=n;++i) ans=ans*deg[i]%mod;
printf("%lld\n",t==1?ans:bfs());
return 0;
}
BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序的更多相关文章
- BZOJ 4011: [HNOI2015]落忆枫音( dp )
DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
- BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...
- BZOJ 4011 HNOI2015 落忆枫音
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题目很长,写得也很有诗意与浪漫色彩,让我们不禁感叹出题人是一个多么英俊潇洒的人. 所 ...
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...
- 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp
题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...
- [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)
传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...
- [BZOJ4011][HNOI2015]落忆枫音:拓扑排序+容斥原理
分析 又是一个有故事的题目背景.作为玩过原作的人,看题目背景都快看哭了ToT.强烈安利本境系列,话说SP-time的新作要咕到什么时候啊. 好像扯远了嘛不管了. 一句话题意就是求一个DAG再加上一条有 ...
- 4011: [HNOI2015]落忆枫音
4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...
随机推荐
- HTML协义代码
这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息. 400- ...
- IIS配置安卓下载.apk文件
前提:你的.apk文件所在路径正确,例如:www.grainnews.com.cn:8002/Attach/Images/201807/20180712091842127.apk 1.打开IIS 2. ...
- for循环练习题:拆解字符并输入下标
test = input('请输入:') for item in range(0,len(test)): print(item,test[item])
- Python 对于分表的操作
在操作数据库的业务里,我们系统采用了orm框架 ,避免了过多的写sql,利用实体对数据库进行操作 需求: 账户系统里的account表是进行了分表,分表规则为accountid进行20取模,测试环境分 ...
- 如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似)
以下为线程 阻塞/唤醒 主要代码 public class MyThread extends Thread { //无意义 private final Object lock = new Objec ...
- js实现回车键搜索
前端关键代码: <input type="text" onkeydown="entersearch()" class="form-control ...
- 从头到尾说一次 Java 垃圾回收,写得非常好! (转)
之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是 C++ 程序员,吃完直接就走的,是 Java 程序员.
- Javaweb实训-宠物医院-社区宠物医院的页面样式
/* CSS Document */ /* 对于CSS来说 每一个元素默认的margin和padding就是0px.但是不同的浏览器会有一个默认的浏览器样式修改默认的marg ...
- Kibana多用户创建及角色权限控制
1 介绍 ELK日志管理属于基础设施平台,接入多个应用系统是正常现象,如果接入多个系统的索引文件没有进行权限划分,那么很大程度会出现索引文件误处理现象,为了避免这种情况发生,多用户及权限设置必不可少. ...
- 2-Elasticsearch原理
参考知乎大佬:https://zhuanlan.zhihu.com/p/62892586 一.倒排索引 倒排索引也叫反向索引,举个例子,理解一下.叫你背一首<静夜思>,立马可以背出,但是叫 ...