【bzoj4011】落忆枫音
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_JUDGEfreopen("a.in","r",stdin);
#endifint 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);}
}
转载于:https://www.cnblogs.com/yoyoball/p/9525695.html
【bzoj4011】落忆枫音相关推荐
- P3244 [HNOI2015]落忆枫音(DAG上的动态规划问题,朱刘定理,乘法逆元)
P3244 [HNOI2015]落忆枫音 样例太坑了!竟然和题目描述给的图不一样! 题目描述 给定一张有向无环图,这张图满足一个性质:以点1为根节点,保证至少有一棵有向树,连接所有的节点. 现在向这张 ...
- Bzoj4011 [HNOI2015]落忆枫音
Time Limit: 10 Sec Memory Limit: 512 MB Submit: 983 Solved: 533 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫 ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...
- [bzoj4011][DP]落忆枫音
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...
- [HNOI2015] 落忆枫音
题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...
- bzoj4011[HNOI2015]落忆枫音
http://www.lydsy.com/JudgeOnline/problem.php?id=4011 记新加入的边的起点为$x$,终点为$y$ 首先,我们先考虑新加入的边没有构成环的情况,即在原图 ...
- luogu3244 bzoj4011 HNOI2015 落忆枫音
这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...
- [HNOI2015]落忆枫音
题目描述 不妨假设枫叶上有 n个穴位,穴位的编号为 1 ~ n.有若干条有向的脉络连接 着这些穴位.穴位和脉络组成一个有向无环图--称之为脉络图(例如图 1),穴 位的编号使得穴位 1 没有从其他穴 ...
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...
- P3244-[HNOI2015]落忆枫音【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3244 题目大意 给出一个DAG\text{DAG}DAG,保证111可以到达所有点.然后再加入一条边(之后不一定 ...
最新文章
- nova-scheduler详解 openstack-ice版
- flutter打开android界面,在已有Android项目中使用Flutter
- spring中IOC设计与实现
- centos nfs java_CentOS下安装配置NFS并通过Java进行文件上传下载
- ToString格式大全
- java图像处理001---图像合成_java实现雨滴头像效果_可以放在地图上使用_自动生成雨滴头像
- NWT失败反省:做视频的多了,汝眼里怎么只有腾讯
- 使用PacketSifter从pcap中筛选有价值的信息
- 线性反馈移位寄存器(Linear Feedback Shift Register, LFSR)
- 量子笔记:酉矩阵(幺正矩阵)、量子门的可逆性
- CodeForces-831A-Unimodal Array (水题)
- 信息技术与计算机课程标准,再谈新课程标准下的信息技术教学
- 挑战SQL经典题(一)
- tomcat 严重: Could not contact localhost:80. Tomcat may not be running.
- 第一个OGSI程序出了此错
- 初中计算机科目三必背,科目三过关5句口诀,你一定要背完!
- 苏大文正计算机基础成绩公布,2019苏大文正学院投档分数线公布:文科319分,理科325分...
- tflearn教程_利用 TFLearn 快速搭建经典深度学习模型
- 图瓦软件研发的《PDMS三维自动出图软件》第100个版本
- bzoj4004[JLOI2015]装备购买