《算法导论》笔记(17) 所有结点对最短路径 部分习题

来源:互联网 发布:淘宝拍摄教学视频 编辑:程序博客网 时间:2024/05/21 09:54

习题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)的传递闭包。对每个点u进行DFS或者BFS,若经过结点v则将T[u, v]标为1。可知最大运行时间为O(VE)。

习题25.3-5 Johnson算法,证明权重为0的环路上每条边的w'(u, v)=0. 首先,若环路只有一条边,首尾只有一个点,边的权重为0,w'为0. 若不止一个结点,因为环路权重为0,则w(u, v)= -w(v, u)。w'(u, v)= w(u, v)+ h(u)- h(v),则当w(u, v)< 0 时,δ(s, v)= δ(s, u)+ w(u, v),或当w(u, v)> 0 时,δ(s, v)= δ(s, u)- w(u, v)。换句话说,δ(s, v)一定包括w(u, v)或 δ(s, u)一定包括w(v, u)。否则会形成负值环路。则h(u)- h(v)= -w(u, v) 或h(v)- h(u)= w(u, v)。则可证得w'(u, v)= w'(v, u)=0。

思考题25-1 动态图的传递闭包。加入一条边(k, l),则扫描传递闭包矩阵中所有元素,只要满足T[u, k]=1同时T[l, v]=1,就将T[u, v] 赋为1。 运行时间O(V^2)。

insert_edge(E(k, l), T) {for u= 1 to n  for v= 1 to n    if T[u, k]==1 and T[l, v]==1 then T[u, v]=1 }


0 0