【BZOJ 4011】[HNOI2015]落忆枫音
题目描述
给出一个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]落忆枫音相关推荐
- BZOJ 4011 HNOI2015 落忆枫音
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题目很长,写得也很有诗意与浪漫色彩,让我们不禁感叹出题人是一个多么英俊潇洒的人. 所 ...
- P3244 [HNOI2015]落忆枫音(DAG上的动态规划问题,朱刘定理,乘法逆元)
P3244 [HNOI2015]落忆枫音 样例太坑了!竟然和题目描述给的图不一样! 题目描述 给定一张有向无环图,这张图满足一个性质:以点1为根节点,保证至少有一棵有向树,连接所有的节点. 现在向这张 ...
- [HNOI2015] 落忆枫音
题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...
- Bzoj4011 [HNOI2015]落忆枫音
Time Limit: 10 Sec Memory Limit: 512 MB Submit: 983 Solved: 533 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫 ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...
- bzoj4011[HNOI2015]落忆枫音
http://www.lydsy.com/JudgeOnline/problem.php?id=4011 记新加入的边的起点为$x$,终点为$y$ 首先,我们先考虑新加入的边没有构成环的情况,即在原图 ...
- [HNOI2015]落忆枫音
题目描述 不妨假设枫叶上有 n个穴位,穴位的编号为 1 ~ n.有若干条有向的脉络连接 着这些穴位.穴位和脉络组成一个有向无环图--称之为脉络图(例如图 1),穴 位的编号使得穴位 1 没有从其他穴 ...
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...
- luogu3244 bzoj4011 HNOI2015 落忆枫音
这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...
- luogu P3244 [HNOI2015]落忆枫音
传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i=2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点 ...
最新文章
- 三类常见软件质量(Quality Attribute)属性的通俗解释
- HBase-1.3.1 集群搭建
- mysql扩展中如何处理结果集_我们如何处理MySQL存储过程中的结果集?
- mysql 临时列_mysql – 在SQL中添加一个临时列,其中值取决于另一列
- C# 3.0 扩展方法
- Django的电子商务网站的调研
- bigpipe merge对F5做批量配置
- 【渝粤题库】陕西师范大学152103 公共行政学
- [分布式训练] 单机多卡的正确打开方式:理论基础
- IPython高级用法(一)定制命令别名及存储别名
- 1: 认识WPF和一个小Demon
- linux列出组_如何列出Linux中的所有组?
- 4种网游外挂制作方法
- flash AS3.0实现进度条与播放暂停按钮的同步
- 操作系统之运行环境简介
- 运维必备——Zabbix监控系统
- php writeup,writeup---你真的会PHP吗?
- 【1024程序员节】创作创富-对话议题-直播笔记
- 2021年黄石二中高考成绩查询,黄石二中2019高考喜报成绩、一本二本上线人数情况...
- vivo手机解析包错误解决方式