正解:拓扑排序+dp

解题报告:

传送门

我好暴躁昂,,,怎么感觉HNOI每年总有那么几道题题面巨长啊,,,语文不好真是太心痛辣QAQ

所以还是要简述一下题意,,,就是说,本来是有一个DAG,然后后来又加入辣一条有向边(x,y),求形成的树的方案数

首先从比较简单的想起,假如加入之后依然麻油环,那就直接计算每个点的入度in,然后tot=Πin[i]就好,还是挺好理解的趴,就每个点可以选从所有指向自己的边中选一条就好,显然都是合法的QwQ

然后所以就会多算,多算的就是加入边(x,y)之后形成的环的数量,算出这个就可以辣

然后考虑它本来保证辣是个DAG,那要形成环肯定是和新加入的(x,y)形成的,就一定是(y,x)的路径

然后题目就变成了统计(y,x)的路径的数量

然后再考虑到它是个有向图,又要形成一棵树,所以直接按拓扑排序后的顺序dp转移就好(然后其实直接拓扑排序的时候dp转移就好了w

还是大概说下怎么转移的趴,,,

设f[i]:强制令树经过节点i到节点y的路径的方案数

初始化是f[y]=ans,因为所有方案中一定都是经过了所有点的,那么y到y的方案数就是总方案数

然后转移是f[x.to]+=f[x]/in[x.to](,,,显然要用逆元,这里强行当作就是在取模意义下的除法就是辣w

理解还是比较好理解的趴,,,?懒得解释辣!

然后关于这里其实还可以有一个理解,推出来的柿子一样但是思想什么的还是比较不一样dei

就题目也可以当作是变成了求新加入的边与原有边构成的环的个数

假如现在枚举到了环S,这个环的构成的方案数就Πin[i](i∈S

那么这个环的贡献就是tot/Πin[i](i∈S

所以结果式子还是一样的,还是拓扑排序+dp转移,只是理解还是有点儿区别所以港下

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ll long long
#define gc getchar()
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)
#define e(x) for(rg ll i=head[x];i;i=edge[i].nxt)
#define t(i) edge[i].to const ll N=+,mod=;
ll n,m,xx,yy,in[N],inv[N],f[N],ed_cnt,head[N],as=;
queue<ll>Q;
struct ed{ll to,nxt;}edge[N<<]; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')ch=gc,y=;
while(''<=ch && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ll x,ll y){edge[++ed_cnt]=(ed){y,head[x]};head[x]=ed_cnt;++in[y];}
il ll ksm(ll x,ll y){ll as=;while(y){if(y&)as=as*x%mod;x=x*x%mod;y>>=;}return as;}
il void topsort()
{
f[yy]=as*inv[yy]%mod;rp(i,,n)if(!in[i])Q.push(i);
while(!Q.empty())
{
ll nw=Q.front();Q.pop();
e(nw){f[t(i)]=(f[t(i)]+f[nw]*inv[t(i)])%mod;--in[t(i)];if(!in[t(i)])Q.push(t(i));}
}
as=(as-f[xx])%mod;if(as<)as+=mod;printf("%lld\n",as);
} int main()
{
n=read();m=read();xx=read();yy=read();rp(i,,m){ll x=read(),y=read();ad(x,y);}++in[yy];
rp(i,,n)as=as*in[i]%mod;rp(i,,n)inv[i]=ksm(in[i],mod-);--in[yy];
if(yy==)return printf("%lld\n",as),;topsort();
return ;
}

洛谷P3244 落忆枫音 [HNOI2015] 拓扑排序+dp的更多相关文章

  1. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)

    原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...

  2. 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp

    题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...

  3. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

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

  4. 洛谷3244 落忆枫音 (拓扑图dp+式子)

    题目大意就是 给你一个DAG 然后添加一条边\(x->y\) ,询问以1为根的生成树的个数 QWQ 首先假设没有添加的边 答案就应该是 \[ans=\prod_{i=1}^{n} in[i] \ ...

  5. [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)

    传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...

  6. [BZOJ4011][HNOI2015]落忆枫音:拓扑排序+容斥原理

    分析 又是一个有故事的题目背景.作为玩过原作的人,看题目背景都快看哭了ToT.强烈安利本境系列,话说SP-time的新作要咕到什么时候啊. 好像扯远了嘛不管了. 一句话题意就是求一个DAG再加上一条有 ...

  7. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...

  8. 【BZOJ4011】【HNOI2015】落忆枫音(动态规划)

    [BZOJ4011][HNOI2015]落忆枫音(动态规划) 题面 BZOJ 洛谷 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜 ...

  9. 【BZOJ】【4011】【HNOI2015】落忆枫音

    拓扑排序+DP 题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103 http://www.cnblogs.com/mmlz/p/44487 ...

随机推荐

  1. MongoDB 备份恢复

    备份: mongodump --host -u admin -p -o /tmp/alldb/ // 备份所有的库 mongodump --host -u admin -p -d mydb -o /t ...

  2. python文件操作笔记

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 2.切换工作目录: os.c ...

  3. 两台Linux主机互传文件可以使用SCP命令来实现

    当两台linux主机之间要互传文件时可使用SCP命令来实现 复制文件: (1)将本地文件拷贝到远程 scp 文件名 --用户名@计算机IP或者计算机名称:远程路径 (2)从远程将文件拷回本地 scp ...

  4. 解决layui下拉选择框只能选择不能手动输入文字

    审查元素可以看到,layui的select下拉框是用input和div模拟出来的,所以,如下例子,我的解决方法是:$('.mySelect').find('input').removeAttr(&qu ...

  5. App store最新审核标准公布

    本文转载至 http://blog.csdn.net/shuidonglCH/article/details/47083623 导读:苹果近日更新了App Store审核指南的相关章节,对此前版本进行 ...

  6. mysql check约束无效

    转自http://blog.csdn.net/maxint64/article/details/8643288 今天在mysql中尝试使用check约束时,才知道在MySQL中CHECK约束是无效的, ...

  7. 服务器搭建--Linux安装erlang

    1.安装依赖环境: 1)安装GCC GCC-C++ Openssl等模块,安装过就不需要安装了 yum -y install make gcc gcc-c++ kernel-devel m4 ncur ...

  8. FastCGI在nginx中的参数

    FastCGI参数 fastcgi主要用于http调用外部解释器的接口,采用c/s结构,可以将http服务器和脚本解析器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程.当HTTP服务器每 ...

  9. STL 迭代器 iterator const

    STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> u ...

  10. 视频播放效果--video.js播放mp4文件

    HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...