私はかなり長い間ダイクストラのアルゴリズムに取り組んでおり、隣接行列を使用して頂点間の最短距離を見つけようとしています。ほとんどのアルゴリズムは正常に動作しているようですが、次の頂点に移動するときに問題が発生します。これが私のコードです:
/*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->matrix[][]==0 または this->matrix[] []==-1) の場合、その頂点は次に調べることができないため、チェックされません。
ここで何か問題が発生します。プログラムを実行すると、まずチェックすべきすべての頂点がチェックされず、チェックすべきでないいくつかの頂点がチェックされるように見えるからです。ある頂点から、実際には現在の頂点の隣ではない別の頂点に移動するという問題がありました。マトリックスを確認しましたが、正しいです。