【问题标题】:Dijkstra's Algorithm c++Dijkstra 算法 c++
【发布时间】:2015-12-09 21:52:20
【问题描述】:

我应该使用邻接矩阵和距离数组来实现 Dijkstra 算法。这些是通过Graph300 类实现的。该程序输入一个带有加权矩阵的文件,并且它正在进入矩阵。

为用户输出距离数组。但我的 Dijkstras 工作不正常。除了起始顶点(用户指定)之外,我一直为每个顶点获取UINT_MAX:

Input matrix (4x4):
0           5           10           4294967295
4294967295  0           4294967295   3
4294967295  7           0            4294967295
4294967295  4294967295  4            0

My distance array should output:
distance[0]=4294967295 -nopath
distance[1]=0  -startnode
distance[2]=7
distance[3]=3

My output now (that is wrong):
distance[0]=4294967295 -nopath
distance[1]=0  -startnode
distance[2]=4294967295
distance[3]=4294967295

这是我的算法; numberNodes 是顶点的维度。 startNode 是用户指定的。矩阵数组和距离数组的类型为unsigned int:

void Graph300::dijkstra300()
{
    int startNode=getStartNode300();

    for (int i = 0; i < numberNodes; i++)
        distanceArray[i] = UINT_MAX;

    distanceArray[startNode] = 0;

    for (int count = 0; count < numberNodes-1; count++)
    {
         unsigned int min = INT_MAX, min_index;

         for (int v = 0; v < numberNodes; v++)
             if (visitedSet[v] == false && distanceArray[v] <= min)
                 min = distanceArray[v], min_index = v;

         int u = min_index;
         visitedSet[u] = true;

         for (int v = 0; v < numberNodes; v++)
             if (!visitedSet[v] && adjacencyMatrix[u][v] && distanceArray[u] != UINT_MAX
                && distanceArray[u]+adjacencyMatrix[u][v] < distanceArray[v])
                  distanceArray[v] = distanceArray[u] + adjacencyMatrix[u][v];
    }
    view300();  // display result
}

【问题讨论】:

  • “工作不正常”不够具体,我们无法提供帮助。请提供可重现的信息:你有什么输入,你得到什么输出,你期望什么输出?
  • '对不起,如果我的代码间距很奇怪。我总是把它复制过来很奇怪'有很多编辑器可以相应地格式化你的代码。作为一个建议,使用它,它会很容易阅读。
  • 你能说出 distanceArray[] 和 adjacencyMatrix[][] 的类型吗?
  • 好的!现在有了你的测试数据和 unsigned int 的使用,我可以找到问题(查看更新的解决方案)

标签: c++ algorithm graph dijkstra


【解决方案1】:

第一眼:

很难 100% 确定解决问题,因为您没有向我们展示类成员类型,也没有向我们展示典型的失败示例。尽管如此,还是会让人眼前一亮:distanceArray[] 的类型是unsigned int 还是int?

在这里你假设它是未签名的:

distanceArray[i] = UINT_MAX;   

但稍后你将这个无符号整数与有符号整数进行比较:

int min = INT_MAX, min_index;   // min is signed integer !

for (int v = 0; v < numberNodes; v++)
   if (... && distanceArray[v] <= min)  // when comparing signed and unsigned you might not get the expected result !!

有符号和无符号之间的不匹配可能会导致您的比较出现意外结果(请参阅online demo)。为避免此类问题,您要么只使用无符号值,要么将所有 UINT_MAX 更改为 INT_MAX。

解决方案

我可以通过您提供的附加数据找出问题,并将所有距离切换为无符号整数。你必须更正你的if:

        if (!visitedSet[v] && adjacencyMatrix[u][v] && adjacencyMatrix[u][v] != UINT_MAX  
            && distanceArray[u] + adjacencyMatrix[u][v] < distanceArray[v])

因为您必须只考虑现有边 (adjacencyMatrix[u][v]!= UINT_MAX)。在您的代码中,您与distanceArray 进行了比较。

我可以运行您的代码(在类之外),并根据您的输入获得预期的输出。这里是online demo。

【讨论】:

  • 我将它更新为无符号整数。数组是无符号的。但是,它并没有改变我的输出。
猜你喜欢
  • 2014-12-22
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
相关资源
最近更新 更多