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。


想法##

这剧情我已无力吐槽。。。

我们先考虑原有向无环图的脉络树方案。

由于无环,所以所有结点(除根节点外)随便找一个指向它的父结点就可构成一棵树。

(原因:边数保证是n-1,且无环,那么一定是一棵树)

设第 \(i\) 的点的入度为 \(in[i]\)

这时

\[ans=\prod\limits_{i=2}^n in[i]
\]

在加了一条 \(X \to Y\) 的边后,仍用这种方法计算的话会考虑一些“树中”有环的情况

如果有环的话,树中一定同时存在 \(X \to Y\) 这条边 和一条 \(Y \leadsto X\) 的路径。

我们需要把这些情况减去。

\[设sum=\prod\limits_{i=2}^n in[i] \\
ans=sum-\frac{sum}{in[a_1]in[a_2]…} - \frac{sum}{in[b_1]in[b_2]…} - …
(其中a、b等为 Y \leadsto X 路径)
\]

如果枚举每条 \(Y \leadsto X\) 的路径显然太慢。

但注意到原图是DAG,故我们可以拓扑排序后dp


代码##

注意:

1.Y=1 的情况要特判

2.拓扑排序d[]与dd[]别写错

#include<cstdio>
#include<iostream>
#include<algorithm> #define P 1000000007 using namespace std; typedef long long ll;
const int N = 100005; struct node{
int v;
node *next;
}pool[N*2],*h[N];
int cnt; void addedge(int u,int v){
node *p=&pool[++cnt];
p->v=v;p->next=h[u];h[u]=p;
}
int in[N]; int Pow_mod(int x,int y){
int ret=1;
while(y){
if(y&1) ret=((ll)ret*x)%P;
x=((ll)x*x)%P;
y>>=1;
}
return ret;
}
int getinv(int x) { return Pow_mod(x,P-2); } int inv[N];
int ans,sum;
int n,m,X,Y; int dd[N],d[N],num,f[N];
void dfs(int u){
int v;
dd[u]=1;
for(node *p=h[u];p;p=p->next)
if(!dd[v=p->v]) dfs(v);
dd[u]=n+1-(++num);
d[dd[u]]=u;
} int main()
{
int u,v;
scanf("%d%d%d%d",&n,&m,&X,&Y);
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
addedge(u,v);
in[v]++;
}
dfs(1);
addedge(X,Y); in[Y]++; sum=1;
for(int i=1;i<=n;i++){
inv[i]=getinv(in[i]);
if(i!=1) sum=((ll)sum*in[i])%P;
}
ans=sum;
if(Y==1) { printf("%d\n",ans); return 0;}
f[Y]=sum;
for(int i=1;i<=n;i++){
u=d[i];
f[u]=((ll)f[u]*inv[u])%P;
for(node *p=h[u];p;p=p->next)
f[p->v]=((ll)f[u]+f[p->v])%P;
}
ans=((ll)ans+(P-f[X]))%P;
printf("%d\n",ans); return 0;
}

[bzoj4011] [洛谷P3244] [HNOI2015] 落忆枫音的更多相关文章

  1. 洛谷P3244 [HNOI2015]落忆枫音

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

  2. luogu P3244 [HNOI2015]落忆枫音

    传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i=2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点 ...

  3. P3244 [HNOI2015]落忆枫音

    思路 给出了一个DAG,要求以1为根的外向树的个数 如果没有加边的条件,就非常好做 每个点都只保留一条入边,最后得到的一定就是一个符合条件的树了(因为给了一个DAG啊) 所以答案是\(\prod_{i ...

  4. bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)

    4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1125  Solved: 603[Submit][Statu ...

  5. BZOJ 4011: [HNOI2015]落忆枫音( dp )

    DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...

  6. [HNOI2015]落忆枫音 解题报告

    [HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...

  7. 4011: [HNOI2015]落忆枫音

    4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...

  8. BZOJ4011: [HNOI2015]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  9. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...

随机推荐

  1. 51nod 天气晴朗的魔法 - (Kruskall最小生成树)

    题目: 基准时间限制:1 秒 空间限制:131072 KB  51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...

  2. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  3. Linux 内核 回顾: ISA

    设计上 ISA 总线非常老了, 并且是非常地低能, 但是它仍然持有一块挺大的控制设备的 市场. 如果速度不重要并且你想支持老式主板, 一个 ISA 实现要优于 PCI. 这个老标准 的另外一个好处是如 ...

  4. JS逻辑运算操作

    非! 如果一个操作数是一个对象,返回false; 如果一个操作数是一个空字符串,返回true; 如果一个操作数是一个非空字符串,返回false; 如果一个操作数是一个数值0,返回true; 如果一个操 ...

  5. pandas小程序应用-实验

    背景:来自于日常工作,针对医院行政人员统计日常门诊信息,手工统计繁琐.容易出错的问题,结合实际特点,采用python对数据进行自动统计. 具体步骤如下: 1.引入python工具包. import p ...

  6. UVW平台运动控制算法以及matlab仿真

    UVW平台运动控制算法以及matlab仿真   最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我.由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些 ...

  7. AES Base64 C++加密工具

    最近写了一段C++ 的AES 加密的工具,在github 上找了很多工具,都不太好用,Star数字比较的高的一个,只能加密16个字节的,加密数字长数据,会出现乱码,不能使用 这里附上代码,文件以供大家 ...

  8. Markdown数学符号

    上标 语法: x^2 效果: \(x^2\) 下标 语法: x_i 效果: \(x_i\) 整体 语法: x^{2y} 效果: \(x^{2y}\) 大括号 语法: \{\} 效果: \(\{\}\) ...

  9. window bat批处理 实用脚本

    一行一行读取txt里的内容 @echo off for /f %%i in (C:\Users\86132\Desktop\name.txt) do ( echo %%i>>name2.t ...

  10. Linux环境下部署svn服务详解

    说明 环境: 操作系统:centos 8.0 IP:39.100.228.13 安装 用ROOT账号登录,在控制台执行以下命令,一直默认安装就好可以了. [root@localhost ~]#yum ...