P2151 [SDOI2009]HH去散步
题目描述
HH有个一成不变的习惯,喜欢饭后百步走。所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离。 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回。 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法。
现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径
输入输出格式
输入格式:
第一行:五个整数N,M,t,A,B。其中N表示学校里的路口的个数,M表示学校里的 路的条数,t表示HH想要散步的距离,A表示散步的出发点,而B则表示散步的终点。
接下来M行,每行一组Ai,Bi,表示从路口Ai到路口Bi有一条路。数据保证Ai != Bi,但
不保证任意两个路口之间至多只有一条路相连接。 路口编号从0到N − 1。 同一行内所有数据均由一个空格隔开,行首行尾没有多余空格。没有多余空行。
答案模45989。
输出格式:
一行,表示答案。
输入输出样例
4 5 3 0 0
0 1
0 2
0 3
2 1
3 2
4
说明
对于30%的数据,N ≤ 4,M ≤ 10,t ≤ 10。
对于100%的数据,N ≤ 50,M ≤ 60,t ≤ 2^30,0 ≤ A,B
Solution:
本题矩阵加速dp。
一眼想到dp,因为刚走过的边不能立即返回,若按点去定义状态就会不好判断重边和刚走过的边的情况,解决办法是按边去定义状态,先把无向边拆成有向边,设$f[i][j]$表示到了第$i$条边走了$j$距离的方案数,于是$f[i][j]=\sum f[k][j-1]$(其中第$k$条边能到第$i$条边,且$i,k$不是同属一条无向边)。
于是就能矩阵优化dp了,初始矩阵就是个$1*2m$的矩阵,其中是$A$的出边都标记为1,然后转移矩阵是$2m*2m$的矩阵,由入边$i$向出边$j$转移,所以使得$matrix[i][j]++$即可。
最后答案就统计到达$B$的入边的方案数之和就好了。
代码:
/*Code by 520 -- 9.11*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
#define Clr(p) memset(&p,0,sizeof(p))
using namespace std;
const int mod=;
int n,m,t,A,B,to[],net[],h[],cnt=;
struct matrix{int a[][],r,c;}; il matrix Mul(matrix x,matrix y){
matrix tp; Clr(tp);
tp.r=x.r,tp.c=y.c;
For(i,,x.r) For(j,,y.c) For(k,,x.c)
tp.a[i][j]=(tp.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
return tp;
} il void solve(int k){
matrix tp,ans; Clr(tp),Clr(ans);
ans.r=,ans.c=tp.r=tp.c=cnt;
for(RE int i=h[A];i;i=net[i]) ans.a[][i]=;
For(u,,n-) for(RE int i=h[u];i;i=net[i]) {
RE int v=to[i];
for(RE int j=h[v];j;j=net[j])
if((j^)!=i) tp.a[i][j]++;
}
while(k){
if(k&) ans=Mul(ans,tp);
k>>=;
tp=Mul(tp,tp);
}
int tot=;
for(RE int i=h[B];i;i=net[i]) tot+=ans.a[][(i^)];
cout<<tot%mod;
} il void add(int u,int v){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt;} int main(){
ios::sync_with_stdio();
cin>>n>>m>>t>>A>>B;
int u,v;
For(i,,m) cin>>u>>v,add(u,v),add(v,u);
solve(t-);
return ;
}
P2151 [SDOI2009]HH去散步的更多相关文章
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
- [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- 洛谷 P2151 [SDOI2009]HH去散步
题目链接 思路 如果没有不能走上一条边的限制,很显然就是dp. 设f[i][j]表示到达i点走了j步的方案数,移到k点可以表示为f[k][j+1]+=f[i][j]. 如果有限制的话,可以考虑用边表示 ...
- Luogu P2151 [SDOI2009]HH去散步 矩乘加速DP
思路:矩乘优化DP 提交:3次(用了一个奇怪的东西导致常数过大) 题解: 如果可以走完正向边后又走反向边那就显然了,但是不能走,所以我们要将正反向边分别编号,区分正反向边. 所以这道题的矩阵是以边的编 ...
- AC日记——[SDOI2009]HH去散步 洛谷 P2151
[SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...
- bzoj1875: [SDOI2009]HH去散步
终于A了...早上按自己以前的写法一直WA.下午换了一种写法就A了qwq #include<cstdio> #include<cstring> #include<iost ...
- BZOJ 1875: [SDOI2009]HH去散步( dp + 矩阵快速幂 )
把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...
- BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法
BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...
随机推荐
- jmeter☞工作区介绍(三)
基于jmeter4.0,jdk1.8 目录树:存放设计过程中使用的元件.执行过程中默认是从根节点开始顺序遍历元件.比如说HTTP请求的取样器就是元件,组件就是一个或多个元件的集合. 测试计划编辑区域: ...
- 通俗理解BFS和DFS,附基本模板
1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...
- C#平均值计算器具体实现
1. 题目及要求 2. Avg.cs 在直接编写窗口程序之前,我们需要创建一个Avg类,我们可以在类库中编辑,也可以像java一样直接在项目中新建类. 有关类库的创建与连接方法,我们在上一次的< ...
- InnoDB表优化
InnoDB表存储优化 适时的使用 OPTIMIZE TABLE 语句来重组表,压缩浪费的表空间.这是在其它优化技术不可用的情况下最直接的方法. OPTIMIZE TABLE 语句通过拷贝表数据并重建 ...
- springboot 前后端分离开发 从零到整(四、更改密码操作)
前端发送更改密码请求,头部携带token,服务端拦截器拦截头部token并解析,根据token中的信息来查询用户信息.需要登录才能进行的操作是由自己定的,有些操作可以直接放行.具体实现是: 上一章写到 ...
- 0.0 配置JAVA环境和Maven环境(W10注意点)
今天上班第一天,真有些忘了之前配置的环境问题,全新的电脑开始配置. 电脑软件JDK以及eclipse都是下载最新的 添加最全的链接吧: 1.JDK配置链接:http://www.cnblogs.com ...
- oracle数据库之rownum和rowid用法
Rownum 和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录. 以下通过例子讲解: -- 为了方便,首先,查找dept表中的所有. select deptn ...
- 安装GNU Radio及相关常用SDR软件的最简单方法
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...
- Harbor 学习分享系列4 - Harbor常用功能实验
前言 本文为Harbor技术分享系列的第4部分也是初级部分的完结篇,下个阶段作者将会进阶分享,更多详细的内容将会将会在文中介绍. 云盘链接 链接:https://pan.baidu.com/s/1PT ...
- 【推荐系统】neural_collaborative_filtering(源码解析)
很久没看推荐系统相关的论文了,最近发现一篇2017年的论文,感觉不错. 原始论文 https://arxiv.org/pdf/1708.05031.pdf 网上有翻译了 https://www.cnb ...