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]$. 那么加 ...
随机推荐
- adobe Keychain mac
Keychain password access This question has been Answered. janec2070563 May 8, 2018 11:07 AM I consta ...
- ASM下添加磁盘
linux下asm磁盘扩容,此次扩容添加4块480G磁盘 第一步:multipath -ll : 查看多路径映射磁盘(两节点都做) 配置 /etc/multipath.conf文件,配置新加磁盘的al ...
- CSS3新特性(阴影、动画、渐变)
一.阴影 1.1文字阴影: text-shadow<length>①: 第1个长度值用来设置对象的阴影水平偏移值.可以为负值 <length>②: 第2个长度值用来设置对象的阴 ...
- c语言程序命名规范:函数、变量、数组、文件名
函数: //send or recv data task void send_recv_data(void *pvParameters); //get socket error code. retur ...
- springboot - 应用实践(2)第一个springboot应用
1.使用maven创建一个快速启动项目 2.引入相关依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...
- Spring(四)--bean的属性赋值
bean的属性赋值 1.需要的实体类 2.需要的配置文件 <?xml version="1.0" encoding="UTF-8"?> <be ...
- 理解ES6的模块导入与导出
export export后必须跟语句, 何为语句, 如声明, for, if 等都是语句, export 不能导出匿名函数, 也不能导出某个已经声明的变量, 如: export const bar ...
- ORA-01406:提取的列值被截断 ; SQL Server :将截断字符串或二进制数据
oracle 数据库可以正常连接,表数据也可以正常读取, 但在程序中相同的位置,有时会报错,有时不会报错,有的电脑会报错,有的不会 报错内容为 ORA-01406:提取的列值被截断 查了网上提供的一些 ...
- spring + redis 实例(一)
这一篇主要是redis操作工具类以及基本配置文本储存 首先我们需要定义一个redisUtil去操作底层redis数据库: package com.lcc.cache.redis; import jav ...
- fid解释
VID就是VLAN ID,这个意思很明白.PVID就是PORT VID,当一个PORT属于多个VLAN时,当它收到不带TAG的数据时,它 就给数据加上TAG,其中VID=PVID.FID就是FILTE ...