繁体   English   中英

Dijkstra算法无法正确输出

[英]Dijkstra Algorithm not outputting correctly

我在实现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;

这是我当前对算法的实现:int startNode; 访问过int

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中的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循环每次都会寻找最短的exp子路径。 不幸的是,您没有重置smallest ,因此它以上一次迭代的最小值开始。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM