洛谷 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\) 有差异,拆成两条边做矩阵快速幂即可。

posted @ 2025-11-07 21:00  xiehanrui0817  阅读(8)  评论(0)    收藏  举报