【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
传送门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相关推荐
- bzoj1875 HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...
- 迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])
快速简单记录老师口胡(可能就我自己看得懂了吧-) 文章目录 T1:舞踏会 title solution code T2:HH去散步 title solution code T3:排序 title so ...
- [BZOJ1975]HH去散步 图论+矩阵
[BZOJ1975]HH去散步 图论+矩阵 题目大意 要求出在一个m条边,n个点的图中,相邻两次走的边不能相同,求在t时间时从起点A走到终点B的路径方案总数.将答案mod45989 输入格式: 第一行 ...
- 【BZOJ1875/SDOI2009】HH去散步
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB ...
- P2151 [SDOI2009]HH去散步
P2151 [SDOI2009]HH去散步 题意: HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻 ...
- BZOJ 1875[SDOI2009]HH去散步
题面: 1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1750 Solved: 851 [Submit] ...
- 线性代数二之矩阵加速DP——数学作业,Arc of Dream
矩阵加速 数学作业 description solution code Arc of Dream description solution code 数学作业 description solution ...
- [SDOI2009]HH去散步(矩阵)
题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...
- 【Bzoj1875】HH去散步
题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...
最新文章
- C# 整数与字符串拼接之间的装箱操作
- stocker模块量化交易分析
- shell命令直接分区
- postmain请求中午乱码_完美解决Get和Post请求中文乱码的问题
- JS 客户端浏览器操作、BOM、渗透客户端浏览器(windows对象:screen屏幕操作、location浏览器域名、history浏览器历史、Navigator浏览器信息、cookie)
- 微信小程序中如何使用setData修改数组或对象中的某一参数
- hdu 1195 Open the Lock
- Hive日期格式转换
- C++输出UNICODE字符集
- [书目20090216]高绩效人士的五项管理 李践作品
- TextWatcher学习
- python表示倍数_python代表倍数
- JavaScript函数——输入某年某月某日,判断这一天是一年中的第几天
- python骰子游戏分析_两个骰子的Python概率骰子游戏
- 大夏shell编程学习笔记(5)
- esx linux 硬盘 扩容,ESX虚拟机添加新磁盘并扩容逻辑卷
- 计算机管理如何格式化u盘,如何格式化U盘【图文教程】
- 走进计算机病毒-受限文件夹的建立
- FastICA算法类有哪些最新发表的毕业论文呢?
- idea springboot mybaits扫描不到第三方jar中的mapper