【发布时间】:2014-04-26 19:48:50
【问题描述】:
我在试图理解 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,相当于无穷大。
此外,对于任何想知道的人;是的,这是家庭作业。不幸的是,我的教授需要一些具体的细节(例如使用 struct T),除了有点模糊的大纲之外,她从未详细介绍如何将 Dijkstra 的算法编写到代码中。我只是问是否有人可以告诉我我做错了什么以及如何解决它,如果可能的话。
非常感谢任何帮助,并且可以节省我大量的时间,以免将头撞到墙上。
【问题讨论】:
-
你的算法是从哪里得到 '8 的?你所有的边的权重都是 5 的倍数...
-
是的,这也让我感到困惑。 :|我还查看了算法的维基百科条目,Oli。我查看了很多关于该算法的在线描述。我没有看到任何遵循二维数组结构的,这是不幸的。
-
你在那里所做的看起来更像是Floyd-Warshall DP 算法,用于所有对最短路径。但是,您的
visited数组在这种情况下没有用,而且是错误的。您还混合了外部两个循环,它们应该是相反的。 Dijkstra 比从单一来源找到最短路径树的效率更高,但它只有在没有负边权重的情况下才有效 -
@user2844013:“我还没有看到任何遵循二维数组结构的东西。”我没有看到问题。维基百科伪代码中的
dist_between(u, v)对应于您的C[u][v]。
标签: c++ algorithm grid dijkstra path-finding