题意: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。

输出格式:一行,表示答案。

分析:考虑如何将双向边变得有差异。把边看成点,正向x->y建一条有向边,反向y->x建一条有向边,如果边E1:x->y , 边E2:y->z 则E1向E2连一条边;这样如何处理走回来的情况呢??只要同一条边拆出来的两个点不相互连边即可;

注意要构造一个虚拟点编号0,它连向点A,为单向边,该边编号为1。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<vector>
  4. using namespace std;
  5. const int mod = 45989;
  6.  
  7. int n,m,t,a,b,x,y,goal,cnt = 1;
  8. int head[60],to[10000];
  9. vector<int> vt[60];
  10.  
  11. struct Node{
  12. int a[200][200];
  13. Node operator *(const Node &x)const{
  14. Node ans;
  15. memset(ans.a,0,sizeof(a));
  16. for(int i = 1; i <= cnt; ++i)
  17. for(int t = 1; t <= cnt; ++t)
  18. for(int k = 1; k <= cnt; ++k)
  19. ans.a[i][t] = (ans.a[i][t]+a[i][k]*x.a[k][t]) % mod;
  20. return ans;
  21. }
  22. }base,ans;
  23.  
  24. void quick_pow(int n){
  25. ans = base;
  26. while(n){
  27. if(n&1) ans = ans*base;
  28. base = base*base; n >>= 1;
  29. }
  30. }
  31.  
  32. int main(){
  33. scanf("%d%d%d%d%d",&n,&m,&t,&a,&b);
  34. ++a, ++b; to[1] = a;
  35. for(int i = 1; i <= m; ++i){
  36. scanf("%d%d",&x,&y);
  37. ++x, ++y;
  38. //cnt表示当前边的编号,to数组是有向边的终点
  39. to[++cnt] = y, vt[x].push_back(cnt);
  40. to[++cnt] = x, vt[y].push_back(cnt);
  41. }
  42. for(int i = 1; i <= cnt; ++i){
  43. int u = to[i];
  44. for(auto &x : vt[u]){
  45. // 如果两条边是来自同一条边,跳过
  46. if(x == (i^1)) continue;
  47. base.a[i][x] = 1;
  48. }
  49. }
  50. quick_pow(t-1);
  51. for(int i = 1; i <= cnt; ++i)
  52. if(to[i] == b) goal = (goal+ans.a[1][i]) % mod;
  53. printf("%d",goal);
  54. return 0;
  55. }

洛谷2151 [SDOI2009]HH去散步(矩阵快速幂,边点互换)的更多相关文章

  1. 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]

    题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...

  2. 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂

    [题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...

  3. bzoj1875 [SDOI2009]HH去散步 矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1875 题解 如果没有这个"不能立刻沿着刚刚走来的路走回",那么这个题就是一 ...

  4. 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)

    一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...

  5. [luogu2151 SDOI2009] HH去散步 (矩阵快速幂)

    传送门 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH ...

  6. bzoj1875 [SDOI2009]HH去散步——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1875 有个限制是不能走回头路,比较麻烦: 所以把矩阵中的元素设成边的经过次数,单向边之间就好 ...

  7. 【bzoj1875】【JZYZOJ1354】[SDOI2009]HH去散步 矩阵快速幂 点边转换

    http://172.20.6.3/Problem_Show.asp?id=1354 http://www.lydsy.com/JudgeOnline/problem.php?id=1875  题意: ...

  8. [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...

  9. 洛谷 P2151 [SDOI2009]HH去散步

    题目链接 思路 如果没有不能走上一条边的限制,很显然就是dp. 设f[i][j]表示到达i点走了j步的方案数,移到k点可以表示为f[k][j+1]+=f[i][j]. 如果有限制的话,可以考虑用边表示 ...

  10. BZOJ 1875 HH去散步(矩阵快速幂)

    题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然 ...

随机推荐

  1. SpringBoot3集成RocketMq

    标签:RocketMq5.Dashboard: 一.简介 RocketMQ因其架构简单.业务功能丰富.具备极强可扩展性等特点被广泛应用,比如金融业务.互联网.大数据.物联网等领域的业务场景: 二.环境 ...

  2. 1、Spring简介

    1.1.概述 Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小. Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 ...

  3. [ABC128D] equeue

    2023-01-14 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 暴力,贪心 解题思路 由题意可以得出,数据只有 \(n \leq 50,k ...

  4. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  5. Unity UGUI的Dropdown(下拉菜单)组件的介绍及使用

    Unity UGUI的Dropdown(下拉菜单)组件的介绍及使用 1. 什么是Dropdown组件? Dropdown(下拉菜单)是Unity UGUI中的一个常用组件,用于在用户点击或选择时显示一 ...

  6. No manual entry for ls终极解决办法

    No manual entry for ls解决办法,最后一种方法一定能解决你的问题 步骤一:确认man是否已经安装 #which man /usr/bin/man---返回此行,证明已经安装 步骤二 ...

  7. HDLbits_Conwaylife

    题目介绍 题目链接 Conwaylife 简介 题目要求我们实现一个康威生命游戏的电路. 该游戏在一个二维网格空间中进行,在该题目中是 16 * 16 的大小,每一个格子都有两种状态(0 或 1),代 ...

  8. PivotGridControl自定义行数据的统计公式

    我们在使用PivotGridControl进行数据统计的时候,用时候需要在不同的行使用不同的汇总公式的情况,本文就是为了说明怎么实现此功能,如下图说明 数据源: 注意:此时数据列指定的SummaryT ...

  9. 「openjudge / poj - 1057」Chessboard

    link. 调起来真的呕吐,网上又没篇题解.大概是个不错的题. 首先行和列一定是独立的,所以我们把行列分开考虑.这样的问题就弱化为:在一个长度为 \(n\) 的格子带上,有 \(n\) 个物品,每个物 ...

  10. Oracle:Ora-01652无法通过128(在temp表空间中)扩展temp段的过程-解决步骤

    现象:查询select * from v$sql时提示"Ora-01652无法通过128(在temp表空间中)扩展temp段的过程" 临时文件是不存储的,可以将数据库重启,重启后重 ...