洛谷 P2151 [SDOI2009]HH去散步
思路
如果没有不能走上一条边的限制,很显然就是dp。
设f[i][j]表示到达i点走了j步的方案数,移到k点可以表示为f[k][j+1]+=f[i][j]。
如果有限制的话,可以考虑用边表示将之前思路中的i变为边的终点,只要不走同一条边,转移还是相同的。
但是t ≤ 2^30,显然直接dp是不可行的,这是机智的题解就想到了矩阵优化。
由于递推关系是线性的,可以搞一个行矩阵表示对于当前移动步数各个边的方案数。
转移可以考虑构造另一个矩阵,所有可以更新的边之间都变为1,其他是0,对于每一次转移都是一样的,所以只要将矩阵跑t次就可以了。
对于初始矩阵,可以加一条边设一个不存在的点,将它与起点相连,也方便之后的领接表。
此题疯狂卡时,辣鸡出题人。(据说多交几次就可以过
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int mod=;
int n,m,t,e,s,cnt,hd[],sum;
struct edge
{
int to,from,nxt;
}v[];
struct mat
{
int a[][];
mat()
{
memset(a,,sizeof(a));
}
mat operator * (mat x)
{
mat ans;
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
for(int k=;k<=cnt;k++)
ans.a[i][j]=(ans.a[i][j]+a[i][k]*x.a[k][j])%mod;
return ans;
}
}c,ans;
void addedge(int x,int y)
{
v[++cnt].nxt=hd[x];
v[cnt].from=x;
v[cnt].to=y;
hd[x]=cnt;
}
mat mul(mat x,int k)
{
mat res;
for(int i=;i<=cnt;i++)
res.a[i][i]=;
for(int i=k;i;i>>=,x=x*x)
if(i&)
res=res*x;
return res;
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&t,&s,&e);
s++,e++;
addedge(,s);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x++,y++;
addedge(x,y),addedge(y,x);
}
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
if((i^j)!=&&v[i].to==v[j].from)
c.a[i][j]=;
ans.a[][]=;
c=mul(c,t);
ans=ans*c;
for(int i=;i<=cnt;i++)
if(v[i].to==e)
sum=(sum+ans.a[][i])%mod;
printf("%d\n",sum);
return ;
}
洛谷 P2151 [SDOI2009]HH去散步的更多相关文章
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
- [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)
一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- P2151 [SDOI2009]HH去散步
题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...
- 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条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...
随机推荐
- Generative Adversarial Nets[Theory&MSE]
本文来自<deep multi-scale video prediction beyond mean square error>,时间线为2015年11月,LeCun等人的作品. 从一个视 ...
- webstrom 使用sass的环境配置说明
sass(https://www.sass.hk)基于Ruby语言开发而成,因此安装sass前需要安装Ruby.(注:mac下自带Ruby无需在安装Ruby!) 一.安装ruby 注意勾选第二个选项 ...
- 深入理解[Future模式]原理与技术
1.Future模式 Future模式和多线程技术密切相关,可以说是利用多线程技术优化程序的一个实例. 在程序设计中,当某一段程序提交了一个请求,期望得到一个答复.但非常不幸的是,服务程序对这个请求的 ...
- 如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务(gts/fescar自动补偿的形式) 基于TCC实现的分布式事务 基于SAGA实现的分布式事 ...
- pycharm 常用快捷键操作
#最重要的快捷键 1. ctrl+shift+A:万能命令行 2. shift两次:查看资源文件 #新建工程第一步操作 1. module设置把空包分层去掉,compact empty middle ...
- JS 面向对象 ~ 创建对象的 9 种方式
一.创建对象的几种方式 1.通过字面量创建 var obj = {}; 这种写法相当于: var obj = new Object(); 缺点:使用同一个接口创建很多单个对象,会产生大量重复代码 2. ...
- Day8 Python基础之遗漏知识点(六)
1. 遗漏知识点 深.浅拷贝: http://www.cnblogs.com/yuanchenqi/articles/5782764.html a=b: 浅拷贝: 深拷贝 集合(set) 集合的定 ...
- 容器化-Docker介绍
导读:本文章对Docker技术进行了介绍,阐述了Docker的技术发展历程.容器与虚拟机的差异.Docker原理.特点.Docker三组件和Docker带来的影响,为我们进一步理解Docker打下基础 ...
- PAT L2-014 列车调度
https://pintia.cn/problem-sets/994805046380707840/problems/994805063166312448 火车站的列车调度铁轨的结构如下图所示. 两端 ...
- How to Configure Email Notification in Jenkins
How to Configure Email Notification in Jenkins? - The Official 360logica Bloghttps://www.360logica.c ...