正解:拓扑排序+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. PHP代码审计笔记--命令执行漏洞

    命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: <?php $target=$_REQUEST['ip']; ...

  2. windows防火墙设置端口开放技巧

    选择“打开或者关闭windows防火墙”把防火墙打开,然后选择“高级设置”,选择“创建规则”来指定端口.(这里也可以在“入站规则”里选择已经存在的端口.) 指定ip开放3389端口 某新服务器,开放8 ...

  3. 重命名和重定向RF执行生成的output文件

    命令: pybot -d output文件保存路径 -o output文件重命名 -d --outputdir dir Where to create output files. The defaul ...

  4. Explaining Delegates in C# - Part 5 (Asynchronous Callback - Way 2)

    In this part of making asynchronous programming with delegates, we will talk about a different way, ...

  5. numpy基本方法

    在学习python的时候常常需要numpy这个库,每次都是用一个查一个,这个,终于见到一个完整的总结了http://blog.csdn.net/blog_empire/article/details/ ...

  6. java基础---->java注解的使用(一)

    注解是众多引入到Java SE5中的重要的语言变化之一.它为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据.今天我们就开始学习一下java中注解的知识. j ...

  7. Visual Studio for Mac离线安装教程

    Visual Studio for Mac离线安装教程 可以在线安装,也可以离线安装(本次安装博主使用离线,在线安装失败了) 据说翻个墙就可以,有条件的就翻吧 没条件的我于是选择离线安装………… 离线 ...

  8. 原生js--表单

    阅读了<javascript权威指南>P396-P409. 一.表单和表单元素的选取 1.选取表单(包含name=“address”属性的form表单) document.querySel ...

  9. LeetCode 48 Rotate Image(2D图像旋转问题)

    题目链接: https://leetcode.com/problems/rotate-image/?tab=Description   Problem:给定一个n*n的二维图片,将这个二维图片按照顺时 ...

  10. 使用maven项目 转XSD、 WSDL 成Java类

    因为项目需要,在网上查找了很多WSDL的使用方式,但是感觉不是特别顺利.现在是利用Maven 项目快速转化的方法. 首先建立一个maven 项目 ,并将下面的pom文件复制进去. <projec ...