传送门1
传送门2
写在前面:今天冒傻气
思路:我第一眼没有看出来它是个矩阵乘法加速DP,只觉得如果这个t小点就直接广搜可以了,后来发现网上的题解无一例外都是矩阵快速幂的时候,我的表情

后来看了看黄学长的题解,才想到是可以利用矩阵乘法的性质进行快速幂的,但是之前并没有做过矩阵加速DP的题目= =这里按照我的理解简单说一下吧
1.先是建邻接表,无向图建双向,其实可以从0或2为起始边开始的,因为这样做求反向边时直接^运算就可以了,但我这里是1建边,所以写了个函数,比较麻烦
2.b是转移矩阵,b.map[i][j]代表在某种情况下第i条路到第j条路的走法总数,而且要排除对于同一条路连续两次来回走的情况,连续转移length-1次(因为有一次要给从起点出发)
3.a是起始矩阵,实际上就是从起点出来到各个边的终点上去,a*b后所谓的a.map[1][i]就是从起点最终到达road[i].son的方法总数,然后就可以随便搞了
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 45989
#define LL long long
using namespace std;
int n,m,s,t,tot,length,ans;
int first[61];
struct os
{int fa,son,next;
}road[130];
struct matrix
{int map[130][130];
}a,b;
int zh(int x)
{if (x&1) return x+1;return x-1;
}
void add(int x,int y)
{road[++tot].fa=x;road[tot].son=y;road[tot].next=first[x];first[x]=tot;
}
matrix mul(matrix a,matrix b)
{matrix c;memset(c.map,0,sizeof(c.map));for (int i=1;i<=tot;i++)for (int j=1;j<=tot;j++)for (int k=1;k<=tot;k++)c.map[i][j]=(c.map[i][j]+(a.map[i][k]*b.map[k][j]%mod))%mod;return c;
}
matrix qr(matrix a,int b)
{matrix c;c=a;b--;while (b){if (b&1) c=mul(c,a);a=mul(a,a);b>>=1;}return c;
}
main()
{scanf("%d%d%d%d%d",&n,&m,&length,&s,&t);int x,y;for (int i=1;i<=m;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);for (int i=1;i<=tot;i++)for (int j=1;j<=tot;j++)if (road[i].son==road[j].fa&&j!=zh(i)) j!=zh(i)排除对于同一条路连续两次来回走的情况b.map[i][j]++;b=qr(b,length-1);for (int i=first[s];i;i=road[i].next)a.map[1][i]++;a=mul(a,b);for (int i=first[t];i;i=road[i].next)ans=(ans+a.map[1][zh(i)])%mod;//zh(i)得到以a[i].son=t的边printf("%d",ans);
}

【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP相关推荐

  1. bzoj1875 HH去散步

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

  2. 迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])

    快速简单记录老师口胡(可能就我自己看得懂了吧-) 文章目录 T1:舞踏会 title solution code T2:HH去散步 title solution code T3:排序 title so ...

  3. [BZOJ1975]HH去散步 图论+矩阵

    [BZOJ1975]HH去散步 图论+矩阵 题目大意 要求出在一个m条边,n个点的图中,相邻两次走的边不能相同,求在t时间时从起点A走到终点B的路径方案总数.将答案mod45989 输入格式: 第一行 ...

  4. 【BZOJ1875/SDOI2009】HH去散步

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB                                       ...

  5. P2151 [SDOI2009]HH去散步

    P2151 [SDOI2009]HH去散步 题意: HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻 ...

  6. BZOJ 1875[SDOI2009]HH去散步

    题面: 1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1750  Solved: 851 [Submit] ...

  7. 线性代数二之矩阵加速DP——数学作业,Arc of Dream

    矩阵加速 数学作业 description solution code Arc of Dream description solution code 数学作业 description solution ...

  8. [SDOI2009]HH去散步(矩阵)

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

  9. 【Bzoj1875】HH去散步

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

最新文章

  1. C# 整数与字符串拼接之间的装箱操作
  2. stocker模块量化交易分析
  3. shell命令直接分区
  4. postmain请求中午乱码_完美解决Get和Post请求中文乱码的问题
  5. JS 客户端浏览器操作、BOM、渗透客户端浏览器(windows对象:screen屏幕操作、location浏览器域名、history浏览器历史、Navigator浏览器信息、cookie)
  6. 微信小程序中如何使用setData修改数组或对象中的某一参数
  7. hdu 1195 Open the Lock
  8. Hive日期格式转换
  9. C++输出UNICODE字符集
  10. [书目20090216]高绩效人士的五项管理 李践作品
  11. TextWatcher学习
  12. python表示倍数_python代表倍数
  13. JavaScript函数——输入某年某月某日,判断这一天是一年中的第几天
  14. python骰子游戏分析_两个骰子的Python概率骰子游戏
  15. 大夏shell编程学习笔记(5)
  16. esx linux 硬盘 扩容,ESX虚拟机添加新磁盘并扩容逻辑卷
  17. 计算机管理如何格式化u盘,如何格式化U盘【图文教程】
  18. 走进计算机病毒-受限文件夹的建立
  19. FastICA算法类有哪些最新发表的毕业论文呢?
  20. idea springboot mybaits扫描不到第三方jar中的mapper

热门文章

  1. 【nodejs原理源码赏析(9)】用node-ssh实现轻量级自动化部署
  2. 华为云开发者青年班——你的优秀值得被全球开发者看到!
  3. 高能街访 | 为什么他们都纷纷为深圳打Call?
  4. SpringBoot和缓存
  5. conda报错Collecting package metadata
  6. pytorch读取单通道图片
  7. Python求转置矩阵最简便的方法
  8. 彻底理解MapReduce shuffle过程原理
  9. 查找:对于长度为n的线性表最坏查找次数
  10. python字符串截取split 失败_python如何截断字符串