洛谷 P2151
给定 \(n\) 个点 \(m\) 条无向边的图以及 \(s, t\),问有多少种 \(s \rightarrow t\) 的路径使得路径长度为 \(k\) 且不能顺着刚走过来的边走回去。
\(n \le 50, m \le 60, k \le 2^{30}\)。
如果没有不能原路返回这个条件就是板子题,搞个 \(O(n^3 \log k)\) 的矩乘即可。
加上这个条件,可以不对点做 flyod,可以对边做。将无向边拆成两条有向边 \((u, v), (v, u)\)。对于 \((u_i, v_i), (u_j, v_j)\),如果 \(v_i = u_ j\& i, j 不是从一条边拆出来的\) 则 \(B_{i, j} = 1\),否则为 \(0\)。
如果 \(u_i = s\),\(A_{1, i} = 1\)。答案是 \(A \cdot B^{k - 1}\) 中 \(v_i = t\) 的边对应的值之和。
时间复杂度:\(O((2m)^3\log k) = O(8m^3\log k)\)。
为了防止不原路返回,要让 \(u \rightarrow v\) 和 \(v \rightarrow u\) 有差异,拆成两条边做矩阵快速幂即可。
浙公网安备 33010602011771号