我试图了解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算法编写到代码中,除了有点模糊的轮廓。我只是在问,如果有可能,有人可以告诉我我做错了什么以及如何解决它。
非常感谢任何帮助,并且可以节省我很多时间从头撞墙。
答案 0 :(得分:1)
这不是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;
}