习题25.1-6 O(n^3)时间内从已经计算出的最短路径权重矩阵L计算出前驱矩阵Π。任意的L[i, j]最短路径,若j结点前驱为k,则必然有L[i, j]= L[i, k]+ w[k, j]。如此可遍历L矩阵的第i行所有元素L[i, k],若L[i, j]= L[i, k]+ w[k, j],表明k是i-> j最短路径的j的前驱结点。
习题25.1-7 在Extend_Shortest_Paths方法中加入记录前驱结点的功能。
extend_shortest_paths(L, W){
for i= 1 to n
for j=1 to n
for k=1 to n
if( L'[i, j]> L[i, k]+ W[k, j] ) { L'[i, j]= L[i, k]+ W[k, j]; P[i, j]=k; }
return L', P
}
slow_all_pairs_shortest_paths(){
L[1]=W;
for m=2 to n-1
L[m], P[m]=extend_shortest_paths(L[m-1])
}
习题25.1-10 找到最短的权重为负值的环路的长度(边数)。最短路径矩阵L中若元素L[i, i]是负值,则表明i在一个负权重的环路中。同时对上面方法找到的前驱矩阵进行查找,得到环路的边数。
习题25.2-4 证明去掉上标的Floyd-Warshall算法是正确的,从而将空间需求降低到Θ(n^2)。对任意k,d[i, j]依赖于d[i, k]和d[k, j],d[i, k]与d[k, j]可能经历了k-1次松弛也可能经历了k次松弛。但不管如何,d[i, j]是中间结点取自{1, 2, ..., k}的一条最短路径。此即循环不变量。则当k取n时,全部d[i, j]均得到了包含所有结点的最短路径。
习题25.2-8 给出一个O(VE)的时间复杂度的算法来计算有向图G(V, E)的传递