Djikstra的最短路径问题

时间:2015-07-11 20:10:34

标签: java graph shortest-path

这是一个算法问题,而不是编码..但我有一个Djikstra算法的实现,似乎适用于大多数图形,但似乎给出了具有许多相等边长的大图形的错误输出。我无法调试它,因为我无法在失败时提出任何小输入。有关如何处理此问题的任何想法?关键功能如下。我正在使用的算法(也许这是不正确的)是:

0)将图表划分为已征服和未征服的集合。初始一分钟堆。

1)从被征服的起始点(S)开始,以及在unconq

中的其他所有内容

2)把所有边缘都放在conq上 - >在堆中没有。

3)获得最小边缘。如果绑定,对于每个最小边缘更新dist并将所涉及的顶点从未征服到被征服。

4)转到2,而未征服的不是空的。

5)在此步骤中,所有边缘都被征服。

我实现了这个并且它主要起作用 - 令人沮丧的是大量输入,其中有许多边缘具有相同的权重,而真正令人沮丧的部分是我的输出在很大程度上匹配正确的输出,只是错误地计算了几个距离。我很确定这个问题与等重量的边缘有关。有什么想法吗?

public int shortestDjikstra() {
    int vertex;
    GenericHeap<Edge> gHeap = new GenericHeap<Edge>();
    Set<Integer> unConquered = new HashSet<Integer>();
    Set<Integer> conquered = new HashSet<Integer>();
    for (int i = 1; i <= N; i++) {
        if (i != S) {
            unConquered.add(i);
            dist[i] = INFINITY;
        }
    }
    vertex = S;
    conquered.add(S);
    Edge[] eList = getEdges(conquered, unConquered);            
    while (unConquered.size() > 0) {
        for (Edge e: eList) {
            assert(e.w != INFINITY);
            gHeap.add(e);
            Integer a[] = e.getEdge();
            updateDist(a[0] ,a[1], e.w);
        }    
        Edge e = gHeap.getMin();
        Set<Integer> verticesToRemove = new HashSet<Integer>();
        while (e != null) {
            Integer a[] = e.getEdge();
            int v2;
            vertex = a[1];
            v2 = a[0]; 
            if (unConquered.contains(a[0])) {
                verticesToRemove.add(a[0]);                   
            } 
            if (unConquered.contains(a[1])) {
                verticesToRemove.add(a[1]);
            }
            updateDist(vertex, v2, e.w);
            e = gHeap.getMinRepeats(e);
        }
        if (verticesToRemove.size() == 0) break;
        for (int v:verticesToRemove) {
            unConquered.remove(v);
        }
        eList = getEdges(verticesToRemove, unConquered);
    }

    printDistList("Final: ");
    return -1;
}

0 个答案:

没有答案