【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】落忆枫音的更多相关文章
- 【BZOJ4011】【HNOI2015】落忆枫音(动态规划)
[BZOJ4011][HNOI2015]落忆枫音(动态规划) 题面 BZOJ 洛谷 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜 ...
- bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)
4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1125 Solved: 603[Submit][Statu ...
- 【BZOJ】【4011】【HNOI2015】落忆枫音
拓扑排序+DP 题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103 http://www.cnblogs.com/mmlz/p/44487 ...
- BZOJ 4011: [HNOI2015]落忆枫音( dp )
DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...
- [HNOI2015]落忆枫音 解题报告
[HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...
- 4011: [HNOI2015]落忆枫音
4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...
- BZOJ 4011 【HNOI2015】 落忆枫音
题目链接:落忆枫音 以下内容参考PoPoQQQ大爷的博客 首先我们先来考虑一下如果没有新加入的那条边,答案怎么算. 由于这是一个\(DAG\),所以我们给每个点随便选择一条入边,最后一定会构成一个树形 ...
- 【bzoj4011 hnoi2015】落忆枫音
题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...
- BZOJ4011: [HNOI2015]落忆枫音
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
随机推荐
- Java 验证码识别库 Tess4j 学习
Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...
- Qt 将字符串转成16进制显示
最近项目用到了需要将字符串转换成16进制显示.这玩意折腾了一上午. 首先,数据块内容 struct UserData { char Head[3] = {'X','J','J'}; char Flag ...
- JMeter测试WebSocket的经验总结
最近有一个微信聊天系统的项目需要性能测试,既然是测试微信聊天,肯定绕不开websocket接口的测试,首选工具是Jmeter,网上能搜到现成的方法,但是网上提供的jar包往往不是最新的,既然是用最新版 ...
- 如何选择 .NET Framework目标版本
如何选择 .NET Framework目标版本 简介 .NET Framework是所有 .NET程序赖以运行的基础. 版本 到目前位置 .NET Framework共出了: .NET Framewo ...
- shell基础 -- 基本正则表达式
正则表达式(Regular Expression,通常简称为 regex 或 RE)是一种表达方式,可以用它来查找匹配特定准则的文本.在许多编程语言中都有用到正则表达式,常用它来实现一些复杂的匹配.这 ...
- Halcon算子解释
Halcon算子解释大全 Halcon/Visionpro视频教程和资料,请访问 重码网,网址: http://www.211code.com Chapter 1 :Classification 1. ...
- 软工第十二周个人PSP
11.30--12.6本周例行报告 1.PSP(personal software process )个人软件过程. C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) Δ ...
- PSP阶段和WBS
项目:PSP Daily 详情请见项目功能说明书 PSP2.1 Personal Software Process Stages 预估耗时长 Planning 计划 · Estimate · 开发 ...
- KNN算法之图像处理一
KNN: 1.数据挖掘分类技术中最简单的方法之一. 2.也称为邻近算法,K最近邻分类算法 3.每个样本都可以用它最接近的k个邻居来代表 4.一般,距离使用欧式距离或曼哈顿距离(通常,k≤20) pyt ...
- [并查集] How Many Tables
题目描述 Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants ...