C++ 具有邻接表的Dijkstra算法

C++ 具有邻接表的Dijkstra算法,c++,path,structure,dijkstra,shortest,C++,Path,Structure,Dijkstra,Shortest,因此,我一直在尝试使用邻接列表实现有向图中最短路径的Dijkstra算法,但不知道是什么原因,它没有打印结果(将所有节点的最小距离打印为0) 我写的代码是: 这意味着有5个节点,7条弧(有向边),这些弧从节点1到节点2存在,代价为10,从节点1到节点3存在,代价为2,依此类推 然而,输出是错误的。我不知道程序会在哪里失败。我从这里得出了主要观点: (最后给出了使用优先级队列的Dijkstra算法的想法) 提前谢谢 劳尔问题就在眼前 weights.resize(nrVertices+1);

因此,我一直在尝试使用邻接列表实现有向图中最短路径的Dijkstra算法,但不知道是什么原因,它没有打印结果(将所有节点的最小距离打印为0)

我写的代码是:

这意味着有5个节点,7条弧(有向边),这些弧从节点1到节点2存在,代价为10,从节点1到节点3存在,代价为2,依此类推

然而,输出是错误的。我不知道程序会在哪里失败。我从这里得出了主要观点: (最后给出了使用优先级队列的Dijkstra算法的想法)

提前谢谢


劳尔

问题就在眼前

weights.resize(nrVertices+1);
readData()
中。这将使用值为0的
nr顶点+1
元素设置向量。稍后,使用
weights将实际值附加到此向量

在实际的Dijkstra算法中,所有感兴趣的
权重
因此都是0,而不是您想要的
INT_MAX

将线路更换为

weights.resize(1);

(只是为了确保索引1真正指的是第一个元素——你似乎用1作为第一个索引而不是0个),它可能会起作用。< /P>我见过的一个更好的问题/答案,涵盖了C++中实现的算法。你可能会发现一些答案很有用。我之所以选择发布这个问题,是因为我确实实现了正确的算法。它取自TopCoder。所以这不是问题所在。问题是,在我的代码的某个地方,发生了一些事情,导致它打印错误的结果。我假设这是因为使用了动态类型列表,更具体地说是向量,以及优先级队列。我的意思是,很可能我在某个地方有一个逻辑错误,与这些“复杂”数据结构的使用有关(不复杂,但比O(N^2)复杂度的简单Dijkstra方法复杂得多)查看了您所附的链接。这不是一个很好的解释,至少没有TopCoder上的解释好(在TopCoder上解释了整个想法,并以三种不同的方式实现-标准、优先级队列、设置-但我仍然无法理解为什么我的程序不能正常工作(即:打印正确的结果)。如果有人能帮我,我会非常感激。提前谢谢。很有趣,因为其中一个答案来自TopCoder。嗯,好吧,我看了一下代码,它看起来并不是这样的:vi D(N,987654321);priority_queue Q;D[0]=0;Q.push(ii(0,0));而(!Q.empty()){ii top=Q.top();Q.pop();int v=top.second,d=top.first;if(d first,cost=it->second;if(d[v2]>d[v]+cost){d[v2]=d[v]+cost;//等等。是的,非常感谢,先生。我没有对代码的这一部分给予足够的注意。我认为问题来自使用优先级队列或动态列表。再次感谢。我真的很感激:)

weights.resize(nrVertices+1);
weights.resize(1);