【BZOJ4011】【HNOI2015】落忆枫音(动态规划)
【BZOJ4011】【HNOI2015】落忆枫音(动态规划)
题面
Description
「恒逸,你相信灵魂的存在吗?」
郭恒逸和姚枫茜漫步在枫音乡的街道上。望着漫天飞舞的红枫,枫茜突然问出
这样一个问题。
「相信吧。不然我们是什么,一团肉吗?要不是有灵魂……我们也不可能再见
到你姐姐吧。」
恒逸给出了一个略微无厘头的回答。枫茜听后笑了笑。
「那你仔细观察过枫叶吗?」
说罢,枫茜伸手,接住了一片飘落的枫叶。
「其实每一片枫叶都是有灵魂的。你看,枫叶上不是有这么多脉络吗?我听说,
枫叶上有一些特殊的位置,就和人的穴位一样。脉络都是连接在这些穴位之间的。
枫树的灵魂流过每片枫叶的根部,沿着这些脉络,慢慢漫进穴位,沁入整片枫叶。
也是因为这个原因,脉络才都是单向的,灵魂可不能倒着溜回来呢。」
恒逸似懂非懂地点了点头。枫茜接着说了下去。
「正是因为有了灵魂,每片枫叶才会与众不同。也正是因为有了灵魂,每片枫
叶也都神似其源本的枫树,就连脉络也形成了一棵树的样子。但如果仔细看的话,
会发现,在脉络树之外,还存在其它的非常细的脉络。虽然这些脉络并不在树上,
但他们的方向也同样顺着灵魂流淌的方向,绝不会出现可能使灵魂倒流的回路。」
恒逸好像突然想到了什么。
「那这些脉络岂不是可以取代已有的脉络,出现在脉络树上?」
枫茜闭上了眼睛。
「是啊,就是这样。脉络树并不是唯一的。只要有一些微小的偏差,脉络树就
可能差之万里,哪怕是在这同一片枫叶上。就像我们的故事,结局也不是唯一的。
只要改变一个小小的选项,故事流程可能就会被彻底扭转。」
「真是深奥啊……」
恒逸盯着这片红枫,若有所思地说。枫茜继续说道。
「还不止如此呢。所有的脉络都不会永恒存在,也不会永恒消失。不管是脉络
树上的脉络,还是之外的细小脉络,都是如此。存在的脉络可能断开消失,消失的
脉络也可能再次连接。万物皆处在永恒的变化之中,人与人之间的羁绊也是。或许
有一天,我们与大家的羁绊也会如同脉络一样,被无情地斩断。或许我们也终将成
为“枫音乡的过客”。或许这一切都会是必然,是枫树的灵魂所决定的……」
枫茜的眼角泛起了几滴晶莹剔透的泪珠。恒逸看着这样的枫茜,将她抱入怀中。
「别这样想,枫茜。就算脉络断开,也有可能还会有新的脉络树,也还会与枫
树的根相连。这样的话,我们的羁绊仍然存在,只是稍微绕了一些远路而已。无论
如何,我都不会离开你的。因为你是我穷尽一生所寻找的,我的真恋啊!」
两人的目光对上了。枫茜幸福地笑了,把头埋进了恒逸的怀抱。从远方山上的
枫林中,传来了枫的声音。
【问题描述】
不妨假设枫叶上有 n个穴位,穴位的编号为 1 ~ n。有若干条有向的脉络连接
着这些穴位。穴位和脉络组成一个有向无环图——称之为脉络图(例如图 1),穴
位的编号使得穴位 1 没有从其他穴位连向它的脉络,即穴位 1 只有连出去的脉络;
由上面的故事可知,这个有向无环图存在一个树形子图,它是以穴位 1为根的包含
全部n个穴位的一棵树——称之为脉络树(例如图 2和图 3给出的树都是图1给出
的脉络图的子图);值得注意的是,脉络图中的脉络树方案可能有多种可能性,例
如图2和图 3就是图 1给出的脉络图的两个脉络树方案。
脉络树的形式化定义为:以穴位 r 为根的脉络树由枫叶上全部 n个穴位以及 n
- 1 条脉络组成,脉络树里没有环,亦不存在从一个穴位连向自身的脉络,且对于
枫叶上的每个穴位 s,都存在一条唯一的包含于脉络树内的脉络路径,使得从穴位
r 出发沿着这条路径可以到达穴位 s。
现在向脉络图添加一条与已有脉络不同的脉络(注意:连接 2个穴位但方向不
同的脉络是不同的脉络,例如从穴位3到4的脉络与从4到3的脉络是不同的脉络,
因此,图 1 中不能添加从 3 到 4 的脉络,但可添加从 4 到 3 的脉络),这条新脉络
可以是从一个穴位连向自身的(例如,图 1 中可添加从 4 到 4 的脉络)。原脉络图
添加这条新脉络后得到的新脉络图可能会出现脉络构成的环。
请你求出添加了这一条脉络之后的新脉络图的以穴位 1 为根的脉络树方案数。
由于方案可能有太多太多,请输出方案数对 1,000,000,007 取模得到的结果。
Input
输入文件的第一行包含四个整数 n、m、x和y,依次代表枫叶上的穴位数、脉
络数,以及要添加的脉络是从穴位 x连向穴位y的。
接下来 m行,每行两个整数,由空格隔开,代表一条脉络。第 i 行的两个整数
为ui和vi,代表第 i 条脉络是从穴位 ui连向穴位vi的。
Output
输出一行,为添加了从穴位 x连向穴位 y的脉络后,枫叶上以穴位 1 为根的脉
络树的方案数对 1,000,000,007取模得到的结果。
Sample Input
4 4 4 3
1 2
1 3
2 4
3 2
Sample Output
3
HINT
对于所有测试数据,1 <= n <= 100000,n - 1 <= m <= min(200000, n(n – 1) / 2),
1 <= x, y, ui, vi <= n。
题解
如果只是一个\(DAG\)
答案很显然是
\]
现在在\(DAG\)上加了一条边,这样就可能形成环了
那么此时我们的答案就要减去成环的情况
成环的情况大概长什么样呢?
一条\(y->x\)的路径再额外的选择\(x->y\)这条边
所以,考虑环上多贡献的答案,
是环上的每个点都选择了环上相应的父亲,并且其他的点随便选择父亲。
也就是
\]
考虑计算每一个点的贡献
设\(f[u]\)表示从\(u\)到\(x\)的所有路径产生的贡献
也就是
\]
我们可以推出转移:
\]
记忆化搜索一下即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 111111
#define MOD (1000000007)
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1,deg[MAX];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;deg[v]++;}
int n,m,X,Y,ans=1,sum=1;
int inv[MAX],f[MAX];
int dfs(int u)
{
if(f[u]!=-1)return f[u];
if(u==X)return f[u]=1ll*sum*inv[deg[u]]%MOD;
f[u]=0;
for(int i=h[u];i;i=e[i].next)
f[u]=(f[u]+dfs(e[i].v))%MOD;
return f[u]=1ll*f[u]*inv[deg[u]]%MOD;
}
int main()
{
n=read();m=read();X=read();Y=read();
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),Add(u,v);
++deg[1];
for(int i=1;i<=n;++i)
{
if(i==Y)ans=1ll*ans*(deg[i]+1)%MOD;
else ans=1ll*ans*deg[i]%MOD;
sum=1ll*sum*deg[i]%MOD;
}
inv[0]=inv[1]=1;
for(int i=2;i<=n;++i)inv[i]=1ll*(MOD-MOD/i)*inv[MOD%i]%MOD;
memset(f,-1,sizeof(f));
ans=(ans+MOD-dfs(Y))%MOD;
printf("%d\n",ans);
return 0;
}
【BZOJ4011】【HNOI2015】落忆枫音(动态规划)的更多相关文章
- bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)
4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1125 Solved: 603[Submit][Statu ...
- BZOJ4011: [HNOI2015]落忆枫音
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
- BZOJ4011 HNOI2015落忆枫音(动态规划+拓扑排序)
DAG中每个点选一条入边就可以构成一棵有向树,所以如果没有环答案就是∏degreei. 考虑去掉含环的答案.可以看做把环缩点,剩下的点仍然可以任意选入边.于是去除的方案数即为∏degreei/∏deg ...
- luogu3244 bzoj4011 HNOI2015 落忆枫音
这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...
- [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP
其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...
- BZOJ4011: [HNOI2015]落忆枫音(dp 乘法原理)
题意 题目链接 Sol 非常妙的一道题 设\(inder[i]\)表示\(i\)号节点的度数 首先如果是个DAG的话,可以考虑在每个点的入边中选一条边作为树形图上的边,这样\(ans = \prod_ ...
- [BZOJ4011][HNOI2015]落忆枫音-[dp乱搞+拓扑排序]
Description 传送门 Solution 假如我们的图为DAG图,总方案数ans为每个点的入度In相乘(不算1号点).(等同于在每个点的入边选一条边,最后一定构成一棵树). 然而如果加了边x- ...
- [BZOJ4011][HNOI2015]落忆枫音:拓扑排序+容斥原理
分析 又是一个有故事的题目背景.作为玩过原作的人,看题目背景都快看哭了ToT.强烈安利本境系列,话说SP-time的新作要咕到什么时候啊. 好像扯远了嘛不管了. 一句话题意就是求一个DAG再加上一条有 ...
- bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...
随机推荐
- CentOS7安装及配置vsftpd (FTP服务器)
CentOS7安装及配置vsftpd (FTP服务器) 1.安装vsftpd 1 yum -y install vsftpd 2.设置开机启动 1 systemctl enable vsftpd 3. ...
- 不会Python开发的运维终将被淘汰?
Python语言是一种面向对象.直译式计算机程序设计语言,由Guido van Rossum于1989年底发明.Python语法简捷而清晰,具有丰富和强大的类库,具有可扩展性和可嵌入性,是现代比较流行 ...
- 深入解析QML引擎, 第1部分:QML文件加载
译者注:这个解析QML引擎的文章共4篇,分析非常透彻,在国内几乎没有找到类似的分析,为了便于国内的QT/QML爱好者和工作者也能更好的学习和理解QML引擎,故将这个系列的4篇文章翻译过来.翻译并不是完 ...
- [转]资深CTO:关于技术团队打造与管理的10问10答
一.你如何衡量软件工程师个人的工作表现?如何衡量整个工程师团队的工作表现? 主要从两方面: 这个员工做的工作是不是他同意做的或者应该做的?(What) 他们是如何完成自己的工作的?(How) 任何绩效 ...
- python3 - 元组、集合
元组(tuple) 有序集合,不可变 a(1,2,3) a[0]获取第一个值 集合(set)增删改 >>> b = set('abc') >>> bset(['a' ...
- MySQL☞左外链接与右外连接
外链接查询:即要查询有关联关系的数据,还要查询没有关联关系的数据.(个人理解为:表A和表B两个关联的列中)如下图: emmm,简单的来说两个表的关联关系:book.bid=bookshop.id,他们 ...
- 随笔1-本想吐槽cnblog编辑器,但是今天猛然发现它竟然这么干净简洁
日常用写作编辑器 多少和我一样有选择综合征的? 不愿意写博客的其中一个非常重要的原因是编辑器不好用! 博客的迁移是相当麻烦的! 所以定下cnblog写东西也是一种勇气!鼓励.... FlashNote ...
- Viper--方便好用的Golang 配置库
前言 本文主要是为读者介绍一个轻便好用的Golang配置库viper 正文 viper 的功能 viper 支持以下功能: 1. 支持Yaml.Json. TOML.HCL 等格式的配置 ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- JPA error org.hibernate.AnnotationException: No identifier specified for entity
错误:org.hibernate.AnnotationException: No identifier specified for entity 原因:JPA所使用的Entity需要标注@Id,在引用 ...