LGP3244题解
考虑正常 DAG 的有向生成树的方案数。
很明显发现,每个节点只需要挑一个父亲即可。方案数为 \(\prod_{i=2}^nd[i]\)。
再考虑加上新边后新增的 DAG 数量。
将点分为两类。假设这条新边是 \((s,t)\),那么我们将能到达 \(s\) 且能够被 \(t\) 到达的节点拎出来算一类,剩下的节点算另一类。
因为是考虑父亲,所以二类节点的贡献仍然是度数。考虑一类节点的贡献。
一类节点的贡献相当于 \(t\) 无法到达 \(s\) 的树的方案数。正难则反,考虑有多少种方法使得 \(t\) 能够到达 \(s\)
总方案数是很容易计算的,度数之积。
我们每次钦定一条从 \(t\) 到 \(s\) 的链,然后强制钦定这些边都要连上。
其他节点的贡献仍然是度数之积。
我们让度数之积最后乘上,变成钦定节点的度数之积的逆元。
我们现在做的问题相当于从 \(t\) 到达 \(s\) 的每条路径的权值之积,随便搞个 DP 统计一下就好了。
复杂度是线性的。(逆元可以预处理)
#include<cstdio>
typedef unsigned ui;
const ui M=1e5+5,mod=1e9+7;
ui n,m,s,t,cnt[2],h[2][M],d[M],deg[M],inv[M],dp[M];bool v1[M],v2[M];ui L,R,q[M];
struct Edge{
ui v,nx;
}e[2][M<<1];
inline void Add(const ui&id,const ui&u,const ui&v){
e[id][++cnt[id]]=(Edge){v,h[id][u]};h[id][u]=cnt[id];
}
signed main(){
ui ans(1);
scanf("%u%u%u%u",&n,&m,&s,&t);inv[1]=1;
for(ui i=2;i<=n;++i)inv[i]=1ull*(mod-mod/i)*inv[mod%i]%mod;
while(m--){
ui u,v;scanf("%u%u",&u,&v);
Add(0,u,v);Add(1,v,u);++d[v];
}
for(ui i=2;i<=n;++i)ans=1ull*ans*d[i]%mod;
for(ui i=1;i<=n;++i)deg[i]=d[i];
q[L=R=1]=t;v1[t]=true;
while(L<=R){
ui u=q[L++];
for(ui v,E=h[0][u];E;E=e[0][E].nx)if(!v1[v=e[0][E].v]){
v1[v]=true;q[++R]=v;
}
}
q[L=R=1]=s;v2[s]=true;
while(L<=R){
ui u=q[L++];
for(ui v,E=h[1][u];E;E=e[1][E].nx)if(!v2[v=e[1][E].v]){
v2[v]=true;q[++R]=v;
}
}
for(ui i=1;i<=n;++i)if(!v1[i]||!v2[i]){
for(ui E=h[0][i];E;E=e[0][E].nx)--deg[e[0][E].v];
}
dp[t]=1;q[L=R=1]=t;
while(L<=R){
ui u=q[L++];
if(u!=t)dp[u]=1ull*dp[u]*inv[d[u]]%mod;
for(ui v,E=h[0][u];E;E=e[0][E].nx)if(v=e[0][E].v,v1[v]&&v2[v]){
dp[v]=(dp[v]+dp[u])%mod;
if(!--deg[v])q[++R]=v;
}
}
printf("%u",1ull*ans*(1+1ull*inv[d[t]]*(1+mod-dp[s])%mod)%mod);
}
LGP3244题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Posix 信号
转载请注明来源:https://www.cnblogs.com/hookjc/ 函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯.有名信号灯总是既可用于线程间的同步,又可以用于进 ...
- VC 窗口置顶并激活为当前窗体
转载请注明来源:https://www.cnblogs.com/hookjc/ if (this != GetForegroundWindow()) ...
- npm 查看一个包的版本信息
有了npm 我们能够简单的一段代码就下载我们需要的包,但是包是不断更新的, 所以我们要关注包的版本信息: 现在,假设我们需要 jquery ,但是jquery现在有很多版本,我们如何通过npm查看呢? ...
- 关于linux shell编程,alias rm='cp $@ ~/backup; rm $@'
书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp $@ ~/backup; ...
- 【BZOJ3545】Peaks(Kruskal重构树 主席树)
题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...
- pycharm工具使用
转自: https://blog.csdn.net/u014044812/article/details/78727496 因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等 ...
- 框架4--NFS网络共享
目录 框架4--NFS网络共享 1.练习 2.昨日问题 3.今日内容 4.NFS简介 5.NFS应用 6.NFS实践 6.1.服务端 6.2.客户端 7.NFS配置详解 8.搭建考试系统 8.1.搭建 ...
- Solution -「LOCAL」解析电车
\(\mathcal{Description}\) 给定 \(n\) 个点 \(m\) 条边的无向图,每条边形如 \((u,v,r)\),表示 \(u,v\) 之间有一条阻值为 \(r\Omega ...
- [LeetCode]1.Two Sum 两数之和(Java)
原题地址:two-sum 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每 ...
- shell脚本部署zookeeper-3.4.10 [含注释]
文章目录 zk_install.sh conf/config conf/zoo_template.cfg package zk_install.sh #!/bin/bash base_path=$(c ...