Error lógico en mi implementación del algoritmo de Dijkstra

He estado trabajando en el algoritmo de Dijkstra durante bastante tiempo, tratando de averiguar la distancia más corta entre los vértices mediante el uso de una matriz de adyacencia. Parece que la mayor parte del algoritmo funciona bien, pero tengo algunos problemas cuando es hora de pasar al siguiente vértice. Aquí está mi código:

/*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;
        }
    }
}

En primer lugar, recorro la matriz para determinar las distancias más cortas de los vecinos del vértice actual y asigno ese valor a dist[]. Hago esto si el vértice no está visitado (no visitado[]!=-1) y si el valor de la matriz indica que es un vecino.

Luego, para verificar qué vértice es el siguiente, recorro todos los vértices y verifico su distancia desde el nodo de inicio, que está en manos de dist[]. Si un vértice ya está visitado (no visitado[]==-1) o si el vértice es el vértice actual o no es vecino del vértice actual (this->matrix[][]==0 or this->matrix[] []==-1), entonces no verificará ya que ese vértice no puede ser el próximo a examinar.

Algo sale mal aquí, porque cuando ejecuto el programa, parece que primero, no verifica con todos los vértices que debería, y segundo, verifica con algunos vértices que no debería; he tenido el problema de que voy de un vértice a otro vértice que en realidad es no un vecino del vértice actual. Revisé la matriz y es correcta.

preguntado el 03 de mayo de 12 a las 14:05

¿Dónde usa el valor en la matriz de adyacencia para actualizar el nuevo distrito? -

@izomorphius Ahora agregué el código donde uso la matriz para determinar las distancias. -

este código irá a dist negativo muy rápido. Debe establecer dist[0] = 0. También donde hace esta verificación dist[i]>=dist[cur_vertex]+this->matrix[cur_vertex][i] compruebe si dist[curr_vertex] es <0 por si acaso. -

@izomorphius ¿Podría explicar cómo irá a distancias negativas? Nunca me he encontrado con ese comportamiento y no veo cómo podría hacerlo; solo verifica si el valor en la matriz es positivo, y dist[cur_vertex] ya tendrá un valor asignado, por lo que no puedo ver cómo puede volverse negativo. -

Primera iteración. dist[0] = -1. Como dist[1] = dist[2] = ... = dist[n] =- 1 entras en el if. Entonces, la distancia a cada vértice se convertirá en matrix[curr_vertex][i]-1. Si la matriz es 0 o -1 o lo que sea que use para indicar que no hay borde, ahí lo tiene. -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.