我实现Dijkstra算法时的逻辑错误

时间:2012-05-03 13:43:41

标签: c++ dijkstra

我一直在研究Dijkstra的算法已经有一段时间了,试图通过使用邻接矩阵找出顶点之间的最短距离。似乎大多数算法工作得很好,但是当它移动到下一个顶点时我遇到了一些问题。这是我的代码:

/*Declarations and initialization*/
int* result;
int dist[this->nr_airport];
int unvisited[this->nr_airport];
int cur_vertex = source;
int check_dist = 0;
bool check_val_found = false;
for(int i=0 ; i<this->nr_airport ; i++)
{
     dist[i] = -1;      //-1 represents infinity
     unvisited[i] = i;  //the set of all unvisited nodes
}
dist[source] = 0;

/*Determining distances*/
for(int i=0 ; i<this->nr_airport ; i++)
{
    if(unvisited[i]!=-1 && this->matrix[cur_vertex][i]>0)   //Check if node is unvisited and neighbour to cur_vertex
    {
        if(dist[i]>=dist[cur_vertex]+this->matrix[cur_vertex][i] || dist[i]==-1)    //Check distance
        {
            dist[i] = dist[cur_vertex]+this->matrix[cur_vertex][i]; //Assign new distance
        }
    }
}

/*Setting the new vertex*/
for(int i=0 ; i<this->nr_airport ; i++)
{
    if(this->matrix[cur_vertex][i]>0 && unvisited[i]!=-1 && dist[i]>0)
    {
        if(!check_val_found)
        {
            check_dist = dist[i];
            cur_vertex = i;
            check_val_found = true;
        }
        if(dist[i]<check_dist)
        {
            check_dist = dist[i];
            cur_vertex = i;
        }
    }
}

首先,我遍历矩阵以确定当前顶点'邻居的最短距离,并将该值分配给dist []。如果顶点未被访问(unvisited []!= - 1)并且矩阵值指示它是邻居,我会这样做。

然后,为了检查下一个顶点,我遍历所有顶点并检查它们与起始节点的距离,该节点由dist []保持。如果已经访问过顶点(unvisited [] == - 1)或者顶点是当前顶点或者不是当前顶点的邻居(this-&gt; matrix [] [] == 0或this-&gt; matrix [] [] == - 1),然后它将不会检查,因为该顶点不能是下一个要检查的顶点。

这里出了点问题,因为当我运行程序时,似乎首先,它不检查它应该的所有顶点,其次,它检查一些顶点它不应该;我遇到的问题是,我从一个顶点到另一个顶点,实际上不是当前顶点的邻居。我检查了矩阵,这是正确的。

0 个答案:

没有答案