我一直在研究 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[]。如果顶点未访问(未访问 []!=-1)并且矩阵值表明它是邻居,我会这样做。
然后,为了检查下一个顶点,我循环遍历所有顶点并检查它们与起始节点的距离,起始节点由 dist[] 保存。如果一个顶点已经被访问过 (unvisited[]==-1) 或者该顶点是当前顶点或不是当前顶点的邻居 (this->matrix[][]==0 或 this->matrix[] []==-1),则它不会检查,因为该顶点不能是下一个要检查的顶点。
这里出了点问题,因为当我运行程序时,似乎首先,它没有检查它应该检查的所有顶点,其次,它检查了一些它不应该检查的顶点;我遇到的问题是我从一个顶点到另一个顶点,实际上它不是当前顶点的邻居。我检查了矩阵,它是正确的。