我刚刚发现了关于瓶颈最短路径的问题,我真的很困惑我们需要在那里找到什么。我们是否需要找到从s到t的路径上的最大成本边缘,包括短边,或者由长边组成的路径上的最小成本边缘?后者对我来说更有意义,它在维基百科右边的图片中描述:https://en.wikipedia.org/wiki/Widest_path_problem
但是当我查看此链接时:http://homes.cs.washington.edu/~anderson/iucee/Slides_421_06/Lecture08_09_10.pdf
在那里描述的算法似乎没有找到由长边组成的路径,我甚至实现了它并在此图上测试了它:
以下是我从上面的链接中获取的算法:
import java.util.ArrayDeque;
import java.util.Comparator;
import java.util.Deque;
import java.util.PriorityQueue;
public class BSP {
private double[] d;
private DirectedWeightedEdge[] edgeTo;
private PriorityQueue<Integer> pq;
private boolean[] visited;
private class VertexComparer implements Comparator<Integer> {
public int compare(Integer one, Integer two) {
if (d[one] < d[two]) return -1;
return 1;
}
}
public BSP(WeightedDigraph G, int source) {
d = new double[G.V()];
edgeTo = new DirectedWeightedEdge[G.V()];
visited = new boolean[G.V()];
for (int i = 0; i < G.V(); ++i) d[i] = Double.POSITIVE_INFINITY;
d[source] = Double.NEGATIVE_INFINITY;
pq = new PriorityQueue<>(new VertexComparer());
pq.add(source);
while (!pq.isEmpty()) {
int top = pq.poll();
if (!visited[top])
relax(G, top);
}
}
private void relax(WeightedDigraph G, int v) {
visited[v] = true;
for (DirectedWeightedEdge e : G.adj(v)) {
if (d[e.to()] > Math.max(d[e.from()], e.weight())) {
d[e.to()] = Math.max(d[e.from()], e.weight());
edgeTo[e.to()] = e;
pq.add(e.to());
}
}
}
public boolean hasPathTo(int v) {
return edgeTo[v] != null;
}
public Iterable<Integer> pathTo(int v) {
assert hasPathTo(v);
int w = v;
DirectedWeightedEdge e = edgeTo[w];
Deque<Integer> stack = new ArrayDeque<>();
for (; edgeTo[w] != null; e = edgeTo[e.from()]) {
stack.push(w);
w = e.from();
}
stack.push(w);
return stack;
}
}
为什么该算法也没有找到由长边组成的路径,从0到3,例如:{0,4},{4,3}并得出结论答案是4?我似乎无法理解为什么它找到路径0-> 1-> 2-> 3而不是。或者有针对性的图形问题有些不同吗?
如果该链接上描述的算法有误,请告诉我正确的算法是什么。我似乎无法理解为什么2个来源提供不同的信息。
答案 0 :(得分:1)
与许多类似的问题一样,瓶颈问题是对称的。事实上,你可以谈论两个不同的问题:
两个版本的算法是相同的,除了你反转所有权重关系(将max-heap更改为min-heap,反之亦然,更改relax()
中的比较符号等)Even Even {3}}陈述:
一个密切相关的问题,minimax路径问题,要求路径 最小化其任何边缘的最大重量。 &LT; ...&GT;任何算法 对于最广泛的路径问题可以转化为算法 通过扭转所有意义上的极小极大路径问题,反之亦然 由算法执行的权重比较,或等效地通过 通过否定取代每个边缘重量。
显然,这两个版本都可以称为瓶颈问题,你刚刚看到讲述第二版的讲义。由于算法是相同的,不会产生太多混淆,你只需要明确你所谈论的版本。