题目描述

给出一个nn个节点mm条边的有向无环图,外加一条有向边(x,y)(x,y),求以11为根的生成树数量。(保证原mm条边中不指向11号节点)

题目解析

GG,考试时看了一眼第一发现没有思路,于是果断暴力,开始打第二题的数据结构,谁知道我的代码那么丑,,,本来的40分只有10分,第一题暴力也gg了,后来想了很久也没想出来,只有找hcx,才发现自己智障了。
首先有向无环图的生成树数量为除根节点以外的入度乘积,由于本题已明确11为根,那么答案就是Πni=2rdi\Pi_{i=2}^{n}rd_{i}。但是这里又有一条边(x,y)(x,y),若加上这条边形成了环,那么方案数就可能包含环的情况,哪么怎么统计包含环的方案数呢?对于一条环路,包含他的方案数为Πni=2rdiΠi∈环rdi\frac{\Pi_{i=2}^{n}rd_{i}}{\Pi_{i\in 环}rd_{i}}。事实上,每一个环都会通过(x,y)(x,y),最多只会有一条环路存在。所以我们可以从xx和yy分别向正反遍历,找到同时覆盖的点,其必然在环上,对于在环上的点,dpidp_{i}表示从yy到了ii号节点时产生的方案数,那么有dpi=(Σj,access(i,j)=truedpj)×inv(rdi)dp_{i}=(\Sigma_{j,access(i,j)=true}{dp_j})\times inv(rd_{i}),invinv表示逆元,那么ans=Πni=2rdi−Πni=2rdi×dpxans=\Pi_{i=2}^{n}rd_{i}-\Pi_{i=2}^{n}rd_{i}\times dp_{x}

代码

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<queue>
using namespace std;#define MAXN 100000
#define MAXM 200000
#define INF 0x3f3f3f3f
typedef long long int LL;
const LL MOD = 1000000007ll;template<class T>
void Read(T &x){x=0;char c=getchar();bool flag=0;while(c<'0'||'9'<c){if(c=='-')flag=1;c=getchar();}while('0'<=c&&c<='9'){x=x*10+c-'0';c=getchar();}if(flag)x=-x;
}int n,m,x,y;
int rd[MAXN+10];struct node{int v;node *nxt;
}*adj1[MAXN+10],*adj2[MAXN+10],Edges[MAXM*2+100],*New=Edges;void addedge(int u,int v){node *p=++New;p->v=v;p->nxt=adj1[u];adj1[u]=p;p=++New;p->v=u;p->nxt=adj2[v];adj2[v]=p;
}LL ksm(LL a,LL p,LL mod){LL rn=1;while(p){if(p&1)rn=rn*a%mod;p>>=1;a=a*a%mod;}return rn;
}LL getinv(LL x,LL mod){return ksm(x,mod-2,mod);
}bool mark1[MAXN+10],mark2[MAXN+10];
void dfs1(int x){//正mark1[x]=true;for(node *p=adj1[x];p!=NULL;p=p->nxt)if(!mark1[p->v])dfs1(p->v);
}
void dfs2(int x){//反mark2[x]=true;for(node *p=adj2[x];p!=NULL;p=p->nxt)if(!mark2[p->v])dfs2(p->v);
}LL dp[MAXN+10];
int tmp[MAXN+10];
queue<int>que;
LL getnum(int s,int t){for(int i=1;i<=n;++i)tmp[i]=rd[i];for(int i=1;i<=n;++i)if(!mark1[i]||!mark2[i]){for(node *p=adj1[i];p!=NULL;p=p->nxt)if(mark1[p->v]&&mark2[p->v])--tmp[p->v];}while(!que.empty())que.pop();que.push(s);dp[s]=1;int now;while(!que.empty()){now=que.front();que.pop();dp[now]=dp[now]*getinv(rd[now],MOD)%MOD;for(node *p=adj1[now];p!=NULL;p=p->nxt)if(mark1[p->v]&&mark2[p->v]){dp[p->v]=(dp[p->v]+dp[now])%MOD;if(!(--tmp[p->v]))que.push(p->v);}}return dp[t];
}int main(){Read(n),Read(m),Read(x),Read(y);++rd[y];int a,b;for(int i=1;i<=m;++i){Read(a),Read(b);++rd[b];addedge(a,b);}LL ans=1;for(int i=2;i<=n;++i)ans=ans*rd[i]%MOD;if(x==1||y==1){printf("%lld\n",ans);return 0;}dfs1(y);dfs2(x);LL num=getnum(y,x);printf("%lld\n",((ans-ans*num%MOD)%MOD+MOD)%MOD);
}
/*
4 5 3 2
1 2
1 4
2 4
4 3
2 3
*/

【BZOJ 4011】[HNOI2015]落忆枫音相关推荐

  1. BZOJ 4011 HNOI2015 落忆枫音

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题目很长,写得也很有诗意与浪漫色彩,让我们不禁感叹出题人是一个多么英俊潇洒的人. 所 ...

  2. P3244 [HNOI2015]落忆枫音(DAG上的动态规划问题,朱刘定理,乘法逆元)

    P3244 [HNOI2015]落忆枫音 样例太坑了!竟然和题目描述给的图不一样! 题目描述 给定一张有向无环图,这张图满足一个性质:以点1为根节点,保证至少有一棵有向树,连接所有的节点. 现在向这张 ...

  3. [HNOI2015] 落忆枫音

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

  4. Bzoj4011 [HNOI2015]落忆枫音

    Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 983  Solved: 533 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫 ...

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

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

  6. bzoj4011[HNOI2015]落忆枫音

    http://www.lydsy.com/JudgeOnline/problem.php?id=4011 记新加入的边的起点为$x$,终点为$y$ 首先,我们先考虑新加入的边没有构成环的情况,即在原图 ...

  7. [HNOI2015]落忆枫音

    题目描述 不妨假设枫叶上有 n个穴位,穴位的编号为 1 ~  n.有若干条有向的脉络连接 着这些穴位.穴位和脉络组成一个有向无环图--称之为脉络图(例如图 1),穴 位的编号使得穴位 1 没有从其他穴 ...

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

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

  9. luogu3244 bzoj4011 HNOI2015 落忆枫音

    这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...

  10. luogu P3244 [HNOI2015]落忆枫音

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

最新文章

  1. 三类常见软件质量(Quality Attribute)属性的通俗解释
  2. HBase-1.3.1 集群搭建
  3. mysql扩展中如何处理结果集_我们如何处理MySQL存储过程中的结果集?
  4. mysql 临时列_mysql – 在SQL中添加一个临时列,其中值取决于另一列
  5. C# 3.0 扩展方法
  6. Django的电子商务网站的调研
  7. bigpipe merge对F5做批量配置
  8. 【渝粤题库】陕西师范大学152103 公共行政学
  9. [分布式训练] 单机多卡的正确打开方式:理论基础
  10. IPython高级用法(一)定制命令别名及存储别名
  11. 1: 认识WPF和一个小Demon
  12. linux列出组_如何列出Linux中的所有组?
  13. 4种网游外挂制作方法
  14. flash AS3.0实现进度条与播放暂停按钮的同步
  15. 操作系统之运行环境简介
  16. 运维必备——Zabbix监控系统
  17. php writeup,writeup---你真的会PHP吗?
  18. 【1024程序员节】创作创富-对话议题-直播笔记
  19. 2021年黄石二中高考成绩查询,黄石二中2019高考喜报成绩、一本二本上线人数情况...
  20. vivo手机解析包错误解决方式

热门文章

  1. 《道德经》「人法地 地法天 天法道 道法自然」
  2. 详解三极管NPN与PNP区别
  3. R语言 Kmeans聚类、PAM聚类、层次聚类、EM聚类
  4. 用CSS制造出光泽一闪而过的图片效果
  5. 液晶面板的表面缺陷及其检测方法
  6. 转型实践|产品设计从青铜到王者—青铜篇
  7. yapi 权限_yapi接口管理平台手册
  8. android输入法好用,安卓手机输入法哪个最好用?
  9. 中宠股份第三季度营收7.55亿元:增速环比持续下滑,净利润转降
  10. 首个单季度盈利,ARPU增速却持续下滑,拼多多已埋下未来隐忧