矩阵加速图上问题学习笔记的学习笔记

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 的顺序顺次相乘(因为时间 还没有出发)。

这就是分组矩阵加速

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/lpf-666/p/14503203.html#%E3%80%90%E7%BB%8F%E5%85%B8%E4%BE%8B%E9%A2%98%E3%80%91

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

原文地址:https://www.cnblogs.com/xsm098/p/14803863.html