[HNOI2015][bzoj4011] 落叶枫音 [拓扑DP]
题面
思路
首先有一个结论(应该是有比较大的利用价值的):
有向无环图的生成外向树树个数等于所有入度非0的点的入度乘积
然后这道题里面,唯一不合拍的因素就是这里有一条可能成环的边
我们可以把这条边先加入原来的DAG里面,然后用上面的结论算出总生成树个数,再减去不合法的,得到答案
那么有哪些方案是不合法的呢?
显然,我们加入一条边形成了环的话,我们前面的计算会算上选择包含新加入的边的某个环的方案,而这个方案是不合法的
假设新加入的边是s->t,那么我们只要找到所有包含t->s的生成树,然后减掉,就得到了答案
具体而言,这里的操作方法,是在原来的DAG上面dp
$dp[t]$初始化为原来的答案,然后往$s$做拓扑序上的$dp$
转移方程是$dp[v]=\sum \frac{dp[u]}{in[u]}$,其中$in[u]$表示原图中的入度
显然只有能够在$t->s$路径上的点的$dp$值才有意义,而这里除掉度数表示的就是这里仅能选一条边
最后用原来答案减掉$dp[s]$即可
Code
```cpp
include
include
include
include
include
include
define ll long long
define MOD 1000000007
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return reflag;
}
int n,m,op,ed,first[100010],cnte;ll in[100010],inv[200010],re[100010];
struct edge{
int to,next;
}a[200010];
inline void add(int u,int v){
a[++cnte]=(edge){v,first[u]};first[u]=cnte;
}
ll ans=1,dp[100010];
int q[100010],head,tail;
void topo(){
int i,u,v;head=tail=0;
dp[ed]=ans;in[ed]--;
for(i=1;i<=n;i++){
if(!in[i]) q[tail++]=i;
re[i]=in[i];
}
in[ed]++;
while(head<tail){
u=q[head++];dp[u]=dp[u]inv[in[u]]%MOD;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;re[v]--;
dp[v]=(dp[v]+dp[u])%MOD;
if(!re[v]) q[tail++]=v;
}
}
}
int main(){
memset(first,-1,sizeof(first));
n=read();m=read();op=read();ed=read();in[ed]++;
int i,t1,t2;
inv[1]=1;
for(i=2;i<=m;i++) inv[i]=(MOD-MOD/i)inv[MOD%i]%MOD;
for(i=1;i<=m;i++){
t1=read();t2=read();
add(t1,t2);in[t2]++;
}
for(i=2;i<=n;i++) ans=ansin[i]%MOD;
if(ed==1){
printf("%lld\n",ans);return 0;
}
topo();
printf("%lld\n",(ans-dp[op]+MOD)%MOD);
}
[HNOI2015][bzoj4011] 落叶枫音 [拓扑DP]的更多相关文章
- 【BZOJ4011】【HNOI2015】落忆枫音(动态规划)
[BZOJ4011][HNOI2015]落忆枫音(动态规划) 题面 BZOJ 洛谷 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜 ...
- codeforces 721C (拓扑+dp)
题意就是某个人去游览,起点是1点,终点是n点,他总的游览时间不能超过t,第一行给你3个数字,点的个数n,边的个数m,时间t,然后底下m行数据,每行代表一条边,边的起点,终点和权值(走过去花的时间),然 ...
- 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)
[BZOJ4010][HNOI2015]菜肴制作(拓扑排序) 题面 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...
- 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)
LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...
- luogu2149 Elaxia的路线 (dijkstra+拓扑dp)
先标记上一个人所有最短路上的边(同时也要标记反向边) 然后拿着另一个人最短路上的边(会构成一个DAG)去做拓扑dp,记从原点到某个点的最大的某个路径的被标记的边的个数 #include<bits ...
- UVA 11324.The Largest Clique tarjan缩点+拓扑dp
题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...
- Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp
A. One-dimensional Japanese Crossword time limit per test 1 second memory limit per test 256 megabyt ...
- bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...
- [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP
其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...
随机推荐
- JSPatch库, 一个Apple官方支持的实现在线更新iOS应用的库
简介 项目主页: https://github.com/bang590/JSPatch 示例下载: https://github.com/ios122/ios122 JSPatch 可以让你用 Jav ...
- Python 初始—(迭代器和生成器)
生成器也是一个迭代器,通过next()函数实现按需计算下一个数据列表生成器,使代码变得更加简洁,只记录当前的位置,只有__next__(), (i*2 for i in range(10)) 生成器( ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- 【shopex】真正可用的app开发机制
shopex的app开发机制详解 网上流传的shopex4.8.5的app开发教程,不仅说得不明不白,而且由于版本问题,照着做根本是做不成的. 知其然,亦要知其所以然. shopex提供了的一个干 ...
- Shell学习——变量
1.在Bash中,每一个变量的值都是字符串 2.查看某个进程的环境变量 cat /proc/$PID/environ | tr '\0' '\n' 3.变量赋值 3.1.var=value,注意var ...
- zabbix运维监控平台
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...
- cx_freeze的安装使用
python是一个非常非常优秀的编程语言,它最大的特性就是跨平台.python程序几乎可以在所有常见的平台中进行使用,而且大部分无需修改任何代码!不过,python也有一点点小缺憾(这个是由于自身本质 ...
- asp.net core-项目开发中问题汇总
无法启动进程\Program File\dotnet\dotnet.exe.进程创建失败,出现错误:系统找不到指定的文件如下图: 解放方案:1.修改系统环境变量 2.重启电脑
- python中的文件操作小结2
''' #-----------文件修改---------- f=open("test_1",'r',encoding="utf-8") f2=open(&qu ...