(PS:洛谷上5789是加强版,3758是可以dp水过的原版)
(本文讲最优做法,能通过加强版的)
题意简述
有$n$个点$m$条边的无向图,你有一个机器人,从点$1$开始走。每次可以:停留在原地,自爆(就不能继续走了),选一个相邻的点继续走。边珂以重复经过。问你走$k$步有多少种情况。答案对$2017$取膜。
(最高数据)$n,m<=100,k<=1e9$。
思路
停留在原地,我们给每个点加一个自环即珂。
自爆的话,我们加入一个新的$E$(设其编号$n+1$即珂)。对于原图的每一个点,都向$E$连一条有向边。$E$就表示一个爆炸的状态:每个点都可以爆炸,爆炸完就回不去了(边是有向的,去了就回不来了)。
然后我们保存一个邻接矩阵$G$。我们发现,$G[u][v]=1$,表示$u$珂以一步走到$v$。
那么$G^k$(矩阵快速幂)表示什么意义呢?容易得到,它表示:走$k$步,珂以经过重复的边,图的连通方案。$G^k[u][v]$表示$u,v$之间长度为$k$的路径的条数(边能重复经过)。
那么我们根据上面的建图方式,建出邻接矩阵,然后矩阵快速幂求$k$次方,$G[1][1]+G[1][2]+…+G[1][n+1]$($n+1$就是点$E$),就是机器人走$k$步的所有方案数了。
代码
1 |
|