我一直在研究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),然后它将不会检查,因为该顶点不能是下一个要检查的顶点。
这里出了点问题,因为当我运行程序时,似乎首先,它不检查它应该的所有顶点,其次,它检查一些顶点它不应该;我遇到的问题是,我从一个顶点到另一个顶点,实际上不是当前顶点的邻居。我检查了矩阵,这是正确的。