堆栈实现了Djikstra的最短路径算法,C ++

时间:2014-11-18 15:27:51

标签: c++ algorithm

编辑:下面的代码运行完美,问题出在我的堆实现中。如果您正在寻找基于堆的Djikstra最短路径算法版本的C ++实现,请随意查看。

我花了最后几个小时试图调试我的Djikstra最短路径算法(使用堆的O(m * log(n)版本)的实现,但是我仍然遇到了很小的一段错误我的测试用例。我遇到问题的测试用例相当大(图中有200个节点),所以我不知道将它包含在这里是多么有用。可以说,我的实现似乎为除了几个节点之外的所有节点生成正确的最短路径。

对于那里的任何算法专家,请你看看我有什么,告诉我哪里出错了?

#include "Heap.h"
#include <sstream>
#include <string>
#include <sstream>
#include <iostream>

void ReadFile(std::vector<Edge> adjList[], std::string fileName);
const int NUM_VERTICES = 200;
const int START_VERTEX = 29;

int main(){
    //valid entries in adjList start from[1] so that vertex #1 is stored in [1].
    std::vector<Edge> adjList[NUM_VERTICES + 1];
    std::vector<int> shortestPaths(NUM_VERTICES + 1);

    ReadFile(adjList, "dijkstraData.txt");
    //ReadFile(adjList, "test.txt");
    Heap heap(NUM_VERTICES);
    heap.InitializeForDjikstras(); 

    HeapEntry min(0, 0);

    //for each of the remaining vertices, process using Djikstra's greedy selection rule
    for (int i = 0; i < NUM_VERTICES; i++){
        shortestPaths[min.id] = min.key;

        //recalculate keys of any nodes that now have edges crossing the boundary between X(processed) and V-X(unprocessed)
        for (int q = 0; q < adjList[min.id].size(); q++){
            int headID = adjList[min.id][q].id;
            int costToHead = adjList[min.id][q].cost;
            HeapEntry head = heap.Delete(headID);

            if (head.key > shortestPaths[min.id] + costToHead) {
                head.key = shortestPaths[min.id] + costToHead;
            }
            heap.Insert(head);
        }
    }
    return 0;
}

如果有必要查看我的堆实现或完整的ReadFile实现,请告诉我,我会发布它。我很确定他们的工作正常。

1 个答案:

答案 0 :(得分:0)

问题实际上是在我的堆实现中。上面的代码是正确的,所以任何寻找Djikstra算法的堆实现的人都可以随意查看。