矩阵加速图上问题学习笔记的学习笔记
P2233 [HNOI2002]公交车路线
推广到一般情况,给定转移矩阵A,A的K次幂代表每个点经过K条边到达其他车站的方案数(A[i][j]=1就是i-->j)
P4159 [SCOI2009] 迷路
经典拆点,在一个东西非常小的时候,考虑把一些点按照这个东西拆成几部分。
注意下标范围是从0开始
https://www.luogu.com.cn/blog/samxiang/solution-p4159
https://www.luogu.com.cn/problem/P2151
CF576D Flights for Regular Customers
套路地对边进行排序(按d值从小到达)。然后每次添加进一条边,判断是否能到达,如果能到达则求答案最小值,否则输出“Impossible”。
now仅仅是一个bool,所以求now的过程用bitset优化一下就好了
非常的离谱,如果不是一般的矩阵,就用结构体,cheng一定要返回结构体。(不要直接在函数里修改,因为修改了从函数里出来修改的东西就没了)。
P2579 [ZJOI2005]沼泽鳄鱼
拆点的话数量太多。
我们发现食人鱼的运动周期比较小,只有2,3,4,这样,我们就可以枚举每一个状态(最多12种状态),处理这个状态时的邻接矩阵,然后判断一下K的大小:如果小于12就暴力乘,如果大于等于12就计算有几个循环,用12个状态相乘得到的矩阵来矩阵快速幂,余数暴力乘。
有一点需要注意的是,由于矩阵乘法不满足交换律,所以我们在把12个状态相乘的时候,需要按 2,3……12,1 的顺序顺次相乘(因为时间 1 还没有出发)。
这就是分组矩阵加速
P2886 [USACO07NOV]Cow Relays G
矩阵乘法重定义后对Floyd的加速
这种类型是考虑是否可以把矩阵乘法重定义,实现状态的转移,同时也要满足结合律(为了让矩阵快速幂可以对其加速)。
最常用的就是换成+,max。
实际上这就是广义矩阵乘法
在这道题里体现为
P6569 [NOI Online #3 提高组]魔法值
注意一般情况下,乘法对异或没有分配律。
因为证明过程中可以通过矩阵只有0/1两种取值来得出结论,所以才可以用矩阵乘法。
P6190 [NOI Online #1 入门组]魔法(民间数据)
注意重边对floyd的初始化影响 d=min(d,v);
这是个有向图。
注意循环变量不要写错。
P5789 [TJOI2017]可乐(数据加强版)
nf是全局变量。
千万不要在main里int nf;
P3502 [POI2010]CHO-Hamsters
kmp预处理一下,加上矩阵乘法就好了
P5678 [GZOI2017]河神
&的处理可以用二进制中每一位都是 1 的数
P3821 Isaac
https://www.luogu.com.cn/problem/solution/P3821
参考文献(排名不分前后):
https://www.cnblogs.com/luckyblock/p/14430820.html
https://oi-wiki.org/math/matrix/#_10
https://www.luogu.com.cn/blog/xiaoziyaoxzy/ju-zhen-jia-su-tu-shang-wen-ti-xue-xi-bi-ji