洛谷 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条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...
随机推荐
- @vue/cli 3 运行支持报错 socket
问题 /sockjs-node/info 无限报错 解决方案 原因是相关代理端不支持 ws,因此需要在代理处关闭 ws,即 ws: false,如下: vue.config.js const ds_p ...
- mysql及python交互
mysql在之前写过一次,那时是我刚刚进入博客,今天介绍一下mysql的python交互,当然前面会把mysql基本概述一下. 目录: 一.命令脚本(mysql) 1.基本命令 2.数据库操作命令 3 ...
- js实现活动倒计时
let startTime = 1527647143949; // 开始时间 var time = new Countdown('timer',startTime); function Countdo ...
- tornado设置cookie并加密
最近看看tornado,遇到了sso的东西,了解下如何设置cookie 1.基本cookie set_cookie 方法在用户的浏览中设置 cookie: get_cookie 方法在用户的浏览中获取 ...
- vue的高阶组件
探索Vue高阶组件 探索Vue高阶组件的使用 Vue高阶组件的使用方法 高阶组件应用-组件重新实例化 深入理解React 高阶组件 探索Vue高阶组件 2018-01-05 探索Vue高阶组件 Vue ...
- stark组件的增删改(新)
1.效果图 2.详细步骤解析 3.总结.代码 1.效果图 增 删除 改 2.详细步骤解析 1.构造增删改查url,反向解析 2.ModelForm定制add.edit页面 3.starak中的 ...
- RestTemplete
RestTemplete是由spring提供的,可以用来模拟浏览器进行服务调用的封装好的Api,和Apache 的HttpClient功能相同,在分布式系统中可以用来服务之间的调用. 开发步骤: 1. ...
- 【学习总结】GirlsInAI ML-diary day-1-初识Python-Anaconda-Jupyter
[学习总结]GirlsInAI ML-diary 总 原博github链接-day1 初识Python-Anaconda-Jupyter: 1-下载并安装Anaconda 官网下载,按指导安装 ana ...
- WCF上传下载文件
思路:上传时将要上传的文件流提交给服务器端 下载时只需要将服务器上的流返回给客户端即可 1.契约,当需要传递的数量多于一个时就需要通过messagecontract来封装起来 这里分别实现了上传和下载 ...
- .net WCF WF4.5
花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...