【发布时间】:2019-05-03 22:33:56
【问题描述】:
我正在上斯坦福的在线算法课,其中一个问题如下:
将路径的瓶颈定义为其中一条路径的最大长度 边缘。两个顶点 s 和 t 之间的最小瓶颈路径是 瓶颈不大于任何其他 s-t 路径的路径。 现在假设图是无向的。给出一个线性时间 (O(m)) 计算两个给定路径之间的最小瓶颈路径的算法 顶点。
使用修改后的 Dijkstra 算法解决此问题,运行时间为 O(mlog(n)),不符合要求。 Wikipedia 声称有
存在一个线性时间算法,用于在 无向图,不使用最大生成树。这 该算法的主要思想是应用线性时间寻路 算法到图中的中值边权重,然后要么 删除所有较小的边或收缩所有较大的边 路径是否存在,并在结果中递归 更小的图表。
有几个问题。该算法主要是挥手,我不是在寻找最宽的路径,而是相反。
This 纸比维基百科有更多的文字,但它也没有涉及血淋淋的细节,尤其是在收缩边缘时。
我已经写出了以下伪代码:
1: MBP(G, s, t)
2: if |E| == 1
3: return the only edge
4: else
5: x = median of all edge weights
6: E' = E - (v, w) where weight(v, w) < x
7: construct G'(V, E')
8: exists = is there a path from s to t in G'
9: if (exists == FALSE)
10: compute all the connected components Cᵢ of G'
11: reinsert the edges deleted into G'
12: G* = G'
13: for each Cᵢ
14: G* = SHRINK(G*, Cᵢ)
15: return MBP(G', s, t)
16: SHRINK(G, C)
17: leader = leader vertex of C
18: V* = {V(G) - C} ∪ {leader}
19: E* = {}
20: for each edge (v, w) ∈ E(G)
21: if v, w ∈ V*
22: E* = E* ∪ {(v, w, weight(v, w))}
23: else if v ∈ C, w ∈ V*
24: E* = E* ∪ {(leader, w, max(weight(v, w)))}
25: return G*(V*, E*)
有几件事我不明白:
- 第 6 行:删除权重高于或低于中位数的边有什么关系?
- 第 20 行:有 3 种类型的边,即两个顶点都在连通分量之外的边,两个顶点都在连通分量中的边,以及一个顶点在连通分量中的边,一种在连通分量之外的边。第一种类型保留它的边缘权重,第二种类型成为自循环并且应该被删除(?)。第三种类型的边缘权重应该是多少?
【问题讨论】:
标签: algorithm graph-theory graph-algorithm minimum-spanning-tree