tarjan 缩点 + 高斯消元.
设 $f(i)$ 表示当前在点 $i$ ,到达终点的期望步数,转移有
$$
f(i)=1+\sum_{i\to j\in E} \frac{f(j)}{outdeg(i)}
$$
直接高斯消元复杂度是 $O(n^3)$ ,无法接受.
注意到成环的情况只可能存在于同一个 SCC 中,而每个 SCC 的大小 $\le 100$ ,考虑对每个 SCC 高斯消元.
用 tarjan 将每个 SCC 缩成一个点,删掉那些不能到终点的点,或者存在某个后继不能到终点的点.
如果起点此时被删掉了,说明答案为 INF .
缩点后的图为 DAG ,将所有点做一个拓扑排序,按照拓扑序从后往前处理每个 SCC .
处理某个 SCC 时,对于每条内部点连出去的边,另一端要么也在该 SCC 内,要么已经在其他 SCC 中被计算过了.
于是用高斯消元可以解出这个 SCC 内所有点的 $f$ 值.
记 SCC 大小为 $s$ ,则时间复杂度为 $O(m+\sum s^3)$ .
实数的高斯消元需要注意精度问题,加个 eps 来判断是否为 0 .
1 | //%std |