c++ - Dijkstra 算法输出不正确

标签 c++ algorithm graph dijkstra

我在实现 Dijkstra 算法时遇到问题。

我初始化了以下变量:

enum GraphLimit300 {MAX_NODES = 50};
typedef unsigned int Element300;
Element300 adjacencyMatrix[MAX_NODES][MAX_NODES];
Element300 distanceArray[MAX_NODES];
bool visitedSet[MAX_NODES];
int numberNodes;

这是我目前的算法实现: 内部开始节点; 访问过;

unsigned int smallest = UINT_MAX;
do
{
    startNode = getStartNode300();
    setVisitedSet300();
    smallest = UINT_MAX;
    visitedSet[startNode] = true;
    for (int i = 0; i < numberNodes; i++)
    {
        distanceArray[i] = adjacencyMatrix[startNode][i];
    }
    for (int i = 0; i < numberNodes - 1; i++)   
    {
        for (int v = 0; v < numberNodes; v++)
        {
            if (visitedSet[v] == false)
            {
                if (distanceArray[v] < smallest)
                {
                    smallest = distanceArray[v];
                    visited = v;
                }
            }
        }
        visitedSet[visited] = true;
        for (int w = 0; w < numberNodes; w++)
        {
            if (visitedSet[w] == false)
            {
                distanceArray[w] = min(distanceArray[w], distanceArray[visited] + adjacencyMatrix[visited][w]);
            }
        }
    }

在这个特定的 for 循环中,它应该执行特定的数学运算以找到节点为假的特定索引处的值之间的最小值,并将最小值存储在该索引中。我发现,在它选择 distaceArray 中的最小值并将其设置为 true(如果我使用下面的数据文件从 1 开始,则为 3,这是正确的。)。

    for (int w = 0; w < numberNodes; w++)
        {
            if (visitedSet[w] == false)
            {
                distanceArray[w] = min(distanceArray[w], distanceArray[visited] + adjacencyMatrix[visited][w]);
            }
        }

它使用节点“0”和“2”,因为此特定迭代是错误的节点。并多次计算并将它们存储在错误的数组中。

我使用的是将数字正确存储在 adjacencyMatrix 中的数据集。

0           5          10          4294967295
4294967295  0          4294967295  3
4294967295  7          0           4294967295
4294967295  4294967295 4           0

正确的输出是:

Distance[0] =4294967295
Distance[1] =0 //Which is the node that I choose to start with
Distance[2] =7
Distance[3] =3

我得到的是:

Distance[0] =3
Distance[1] =0
Distance[2] =3
Distance[3] =3

我已经手动完成了这个过程,以确认我应该得到的正确输出是真实的并且是正确的。

在以下情况下更新:

if (visitedSet[w] == false && adjacencyMatrix[visited][w] != UINT_MAX)
                {
                    distanceArray[w] = min(distanceArray[w], distanceArray[visited] + adjacencyMatrix[visited][w]);
                }

最佳答案

这里的问题又来了,你应该只考虑存在的边,即 adjacencyMatrix[visited][w]!=UINT_MAX

如果不排除这些边,distanceArray[visited] + adjacencyMatrix[visited][w] 会溢出,min() 不会返回结果你所期望的。

你可以通过改变这一行来解决这个问题:

if (visitedSet[w] == false && adjacencyMatrix[visited][w]!=UINT_MAX ) 

编辑:

您的嵌套 for 循环中确实隐藏了另一个问题。第一个内部 for 循环每次查找要展开的最短子路径。不幸的是,您没有重置 smallest,因此它从上一次迭代的最小值开始。

按如下方式更新循环,您将得到预期的结果:

for (int i = 0; i < numberNodes - 1; i++)   
{
    smallest = UINT_MAX; // !!!!!!!!!!!!!!!!!!!!!!!
    for (int v = 0; v < numberNodes; v++) 
    {
        ...
    }
    ...
} 

关于c++ - Dijkstra 算法输出不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34191136/

相关文章:

c++ - 传递给函数后 vector 的大小发生变化

c++ - 将初始化列表包装在括号内有什么影响?

c++ - 快速排序实现,找不到错误

python - 我应该如何调用在主函数之外定义的函数?

algorithm - 从图中删除边后如何更新MST?

c++ - 静态变量无法解析

java - 为什么用某些编译器编译的程序可以被反编译而其他的(实际上)不能?

algorithm - 分组密码算法

python - 使用python从节点n开始的所有长度为L的路径

python - tensorflow 图节点名称与操作名称不匹配