Module: 弗洛伊德算法


Problem

4 /10


最短路线

Theory Click to read/hide

如果一个图有负权重的循环,那么形式上 Floyd-Warshall 算法不适用于这样的图。

事实上,对于那些顶点对 i j,在它们之间不可能进入一个负权重的循环,该算法将正确工作。

对于没有答案的同一对顶点(由于它们之间的路径上存在负循环),弗洛伊德算法会找到一些数字(可能是强负数,但不一定)作为答案。然而,可以改进 Floyd 算法以巧妙地处理此类顶点对并输出例如 \(- \infty\)

要做到这一点,例如,可以做到以下 条件 “路径不存在”。因此,让通常的 Floyd 算法在此图上运行。那么在顶点 i  和 j  之间没有最短路径当且仅当存在从 i  可达的顶点 t 并且从该顶点可达 j 时,  \(d [t][t]<0\).

此外,当使用 Floyd 算法处理具有负循环的图时,应该记住,在工作过程中出现的距离可能会随着每个阶段呈负增长,呈指数增长。因此,您应该通过将下方的所有距离限制为某个值(例如, \(- \infty\))来防止整数溢出。

口头上,解决方案可以描述如下:
在 Floyd-Warshall 算法对输入图起作用后,让我们遍历所有顶点对\((i,j)\),并针对每一对顶点我们检查,无限地从 i 到 j 的最短路径是否小。为此,让我们遍历第三个顶点 t,如果结果是 \(d[t][t] < 0\)  (即它位于负权重的循环中),并且它可以从 i and j— 到达那么路径 \((i,j)\) 可以是无限小的长度。

Problem

给你一个有向的完整图,它的边有一些权重(长度)。权重可以是正数、负数或零。我们感兴趣的是该图中所有不同顶点对之间所有可能路径的最小长度。有必要找出这个最小值是否存在,如果存在,请计算它。 (如果有可能在图中找到一条负长度的路径,绝对值任意大,趋于无穷大,则没有最小值)。
 
输入
第一行是N≤50个顶点。接下来是图的邻接矩阵,即N行,每行包含N个数。邻接矩阵第 i 行中的第 j 个数指定从第 i 个顶点到第 j 个顶点的边的长度。长度可以取-1000000到1000000之间的任何值。保证矩阵的主对角线上有零。
 
输出
打印单个数字 –所需的最小值。如果不存在,则输出  -1.
例子 <头> <日># <正文>
输入 输出
1
3
0 42 18468 
6335 0 26501 
19170 15725 0 
42
2
3
0 -7 3
-2 0 10
2 215 0 
-1