瓶颈最短路径是从s到t的最短边缘或最长边缘的集合吗?

时间:2015-10-12 13:31:01

标签: algorithm graph

我刚刚发现了关于瓶颈最短路径的问题,我真的很困惑我们需要在那里找到什么。我们是否需要找到从s到t的路径上的最大成本边缘,包括短边,或者由长边组成的路径上的最小成本边缘?后者对我来说更有意义,它在维基百科右边的图片中描述:https://en.wikipedia.org/wiki/Widest_path_problem

但是当我查看此链接时:http://homes.cs.washington.edu/~anderson/iucee/Slides_421_06/Lecture08_09_10.pdf

在那里描述的算法似乎没有找到由长边组成的路径,我甚至实现了它并在此图上测试了它:enter image description here

以下是我从上面的链接中获取的算法:

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个来源提供不同的信息。

1 个答案:

答案 0 :(得分:1)

与许多类似的问题一样,瓶颈问题是对称的。事实上,你可以谈论两个不同的问题:

  • 找一条最短边缘尽可能长
  • 的路径
  • 查找最长边缘尽可能短
  • 的路径

两个版本的算法是相同的,除了你反转所有权重关系(将max-heap更改为min-heap,反之亦然,更改relax()中的比较符号等)Even Even {3}}陈述:

  

一个密切相关的问题,minimax路径问题,要求路径   最小化其任何边缘的最大重量。 &LT; ...&GT;任何算法   对于最广泛的路径问题可以转化为算法   通过扭转所有意义上的极小极大路径问题,反之亦然   由算法执行的权重比较,或等效地通过   通过否定取代每个边缘重量。

显然,这两个版本都可以称为瓶颈问题,你刚刚看到讲述第二版的讲义。由于算法是相同的,不会产生太多混淆,你只需要明确你所谈论的版本。