编辑:下面的代码运行完美,问题出在我的堆实现中。如果您正在寻找基于堆的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实现,请告诉我,我会发布它。我很确定他们的工作正常。
答案 0 :(得分:0)
问题实际上是在我的堆实现中。上面的代码是正确的,所以任何寻找Djikstra算法的堆实现的人都可以随意查看。