Dijkstra 算法返回不正确的值
Dijkstra's algorithm returning incorrect values
我在试图理解Dijkstra的算法时遇到了困难。简而言之,该算法在给定A和B之间的距离的情况下,找到它们之间的最短距离。
我将发布我的算法版本(到目前为止,我在网上搜索还没有取得多大成功),然后是节点之间的距离。
void GraphM::findShortestPath()
{
for (int i = 1; i <= nodeCount; i++) // From Node i...
{
for (int v = 1; v <= nodeCount; v++) // ...through Node v...
{
for (int w = 1; w <= nodeCount; w++) // ...to Node w
{
if (!T[i][w].visited || !T[i][v].visited)
{
T[i][w].dist = min(T[i][w].dist, T[i][v].dist + C[v][w]);
T[i][v].visited = true;
T[i][w].visited = true;
}
}
}
}
cout << "1 to 2 is " << T[1][2].dist << endl;
}
这会输出以下内容:
1 to 2 is 48
什么时候应该是
1 to 2 is 40
我使用的值如下:
1 2 50
1 3 20
1 5 30
2 4 10
3 2 20
3 4 40
5 2 20
5 4 25
其中,在每一行中,第一个令牌是第一个节点,第二个令牌是第二个节点,而第三个令牌是这些节点之间的距离(在算法的情况下,这些令牌将是i、v和T[i][v].dist)。在算法中,nodeCount是网格中的节点数(5),w是我们正在寻找从i到的距离的节点。C[v][w]返回v和w之间的原始距离。因此,如果v是5,w是2,C[v][w]将返回20。这是常数,而T[v][w].dist(例如)可以更改。
任何不存在的节点关系,如C[5][3]或T[1][4].dist(至少在一开始)都返回INT_MAX,它等价于无穷大。
此外,对于任何想知道的人;是的,这是一项家庭作业。不幸的是,我的教授需要一些具体的细节(比如使用结构T),除了一个有点模糊的大纲外,她从未详细介绍过如何将Dijkstra的算法写入代码。我只是想问是否有人能告诉我我做错了什么,如果可能的话,如何解决。
我们非常感谢任何帮助,这将为我节省很多时间,使我不用把头撞到墙上。
这不是Dijkstra的算法。你试图实现的是Floyd-Warshall算法。这将找到所有顶点对的最小距离。
http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm
请注意,第一个循环循环通过传输节点。使用此实现,您不需要记住您已经访问过的边缘。
void GraphM::findShortestPath()
{
// Initialize T[i][j] to C[i][j] or MAX_INT here
for (int k = 1; k <= nodeCount; k++) // Through Node k...
{
for (int u = 1; u <= nodeCount; u++) // ...From Node u...
{
for (int v = 1; v <= nodeCount; u++) // ...to Node v
{
// if going through k provides a cheaper path, update T[u][v]
T[u][v] = min(T[u][v], T[u][k] + T[k][v]);
}
}
}
cout << "1 to 2 is " << T[1][2]<< endl;
}
- 在C++中返回不正确的楼层函数值
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- wcslen() 在使用编译指示包时返回不正确的结果
- 乘法返回我的值不正确
- 为什么代码不能返回正确的值?
- 派生类继承的 getter,找不到返回正确值的方法
- 返回类型不正确
- 当我输入分数值时,它返回不正确的结果
- ifstream::read 不断返回不正确的值
- Strftime在iOS上返回一周中不正确的一天
- C++ 中的 MD5 实现返回不正确的摘要
- AccessibleObjectFromPoint() 返回一个不正确的对象
- C 程序不会返回正确的阶乘值
- C 从文件中读取FSTREAM数据不会返回正确的值.inputfile.tellg返回-1
- MSVC OSVersion 返回不正确的版本
- C++ GetModule文件名不会返回正确的字符串
- 'SystemParametersInfo'函数在获取桌面壁纸时返回不正确的值
- 创建 CTime @ 2am 不会返回正确的值(Windows CE,C++)
- c++winsock-recv()返回不正确且奇怪的缓冲区
- Winsock recv() 返回不正确的数据