Portal --> bzoj4011

Solution

​  这题。。看了一眼之后深陷矩阵树定理然后我看了一眼数据范围==

  注意到是有向无环图,DAG有十分多优秀的性质所以,这题需要充分利用这个条件

  首先考虑没有加边的时候,也就是单纯求这个DAG的生成树个数怎么做

​  其实仔细想一下不难得出答案就是各个点(除了\(1\)号点)的入度的乘积

​   

  然后我们看加了一条边之后会发生什么

1、这条边会形成自环:显然答案不变

2、这条边加入后不会形成环:那直接更新一下入度然后重新再算一遍就好了

3、这条边加入后会形成一个环:

​  重头戏

​  正着想其实。。不是特别便于统计,这个时候!正难则反!

​  我们考虑从直接按照DAG的方法算出来的答案中减去那些不合法的方案,那么怎么样的方案才是不合法的呢,仔细思考一下,应该就是满足以下两个条件:

​  (1)选了\((x,y)\)这条边(就是新连的那条)

​  (2)形成了一个环

​  然后因为原来的图是DAG,这个环显然应该是包含\((x,y)\)这条边的,或者更加直观地说,这个环应该是\((x,y)\)这条边和一条从\(y\)到\(x\)的路径组成的

​  那么现在问题就转化成了统计从\(y\)到\(x\)的路径的“方案数”,这里的方案数要打引号是因为。。更准确地说应该是确保选边方案中存在一条\(y\)到\(x\)路径并且包含\((x,y)\)这条边的生成树个数,具体的统计其实就跟普通的DAG路径计数一样的套路,拓扑排序一波

​  我们用\(val[x]\)表示\(y\)到\(x\)路径的“方案数”,初始化就是\(val[y]=\)按照DAG方式算出来的答案,然后每一个点转移时候的贡献应该是\(val[i]/in[i]\),其中\(in[i]\)表示的是在加入\((x,y)\)这条边之后\(i\)点的入度,具体为什么的话是因为。。走到\(i\)的时候,\(i\)的前驱其实已经确定了,所以没有\(in[i]\)种选择

​   

​  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e5+10,MOD=1e9+7;
struct xxx{
int y,nxt;
}a[N*2];
queue<int> q;
int h[N],in[N],d[N],val[N];
int vis[N];
int n,m,tot,ans,X,Y,ans1;
void add(int x,int y){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;}
void dfs(int x){
int u;
vis[x]=true;
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (vis[u]) continue;
dfs(u);
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y;
scanf("%d%d",&n,&m);
scanf("%d%d",&X,&Y);
memset(h,-1,sizeof(h));
tot=0;
for (int i=1;i<=m;++i){
scanf("%d%d",&x,&y);
add(x,y);
++in[y];
}
ans=1;
for (int i=2;i<=n;++i)
ans=1LL*ans*in[i]%MOD;
if (X==Y){printf("%d\n",ans);return 0;}
dfs(Y);
if (!vis[X]){
++in[Y];
ans=1;
for (int i=2;i<=n;++i) ans=1LL*ans*in[i]%MOD;
printf("%d\n",ans);
}
else{
for (int i=h[Y];i!=-1;i=a[i].nxt)
--in[a[i].y];
ans1=1;
for (int i=2;i<=n;++i) ans1=1LL*ans1*in[i]%MOD;
ans=(1LL*ans+ans1)%MOD;
printf("%d\n",ans);
}
}

【bzoj4011】落忆枫音的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 4011: [HNOI2015]落忆枫音

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

  7. BZOJ 4011 【HNOI2015】 落忆枫音

    题目链接:落忆枫音 以下内容参考PoPoQQQ大爷的博客 首先我们先来考虑一下如果没有新加入的那条边,答案怎么算. 由于这是一个\(DAG\),所以我们给每个点随便选择一条入边,最后一定会构成一个树形 ...

  8. 【bzoj4011 hnoi2015】落忆枫音

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

  9. BZOJ4011: [HNOI2015]落忆枫音

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

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

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

随机推荐

  1. jenkens其实是代码上传工具

    Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...

  2. fastdfs+nginx+image_filter安装与生成缩略图

    fastdfs简介 类似google FS的一个轻量级分布式文件系统,纯C实现,支持linux.FreeBSD等UNIX系统: 只能通过API访问,不支持POXIS: 文件不分块存储,上传的文件和OS ...

  3. 【UGUI】 (一)------- 放大镜

    在许多游戏或应用中,我们常常看到放大镜的身影,而在Unity里面,制作一个简易的放大镜是非常简单的.    一. 创建一个3DObject 创建一个Cube或者 Cylinder,这里为了更像放大镜一 ...

  4. 【springmvc+mybatis项目实战】杰信商贸-6.重点知识回顾

    1.重点知识回顾 Maven1)覆盖仓库文件,实际企业开发,公司会架一个测试服务器,在测试服务器中架私服.我们开发人员的程序,都连接私服.当本地没有项目中要使用的jar,Myeclipse maven ...

  5. AirSim的搭建和使用

    由于自己使用设备拍摄的数据质量太差,所以决定使用AirSim这个框架来生成数据.之所以使用这个框架,是因为之前同事用其生成了一些有效数据. 当然,我是不可能把我搭建的步骤一一写出来的,一来是因为太麻烦 ...

  6. 如何使用openstack OCL

    本节首先讨论 image 删除操作,然后介绍 OpenStack CLI 的使用方法,最后讨如何 Troubleshoot. Web UI 删除 image admin 登录后,Project -&g ...

  7. Java:重写equals()和hashCode()

    Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...

  8. Scrum立会报告+燃尽图(十月二十七日总第十八次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...

  9. 《Linux内核与分析》第五周

    20135130王川东 一.给MenuOS增加time和time-asm命令 命令:1.强制删除:rm menu -rf 2.克隆:git clone (后跟需要克隆数据所在的位置) 3.自动编译,自 ...

  10. struts-resultType属性

    1.默认dispatcher:forward方式,服务器端跳转 2.redirect:客户端跳转 3.chain:Action转发,forward方式,服务器端跳转action 4.redirectA ...