Dijkstra para el algoritmo de ruta más corta de una sola fuente

Descripción del algoritmo:

    Dijkstra resuelve el problema del camino más corto de una sola fuente en un gráfico dirigido con pesos. El algoritmo requiere que los pesos de todos los bordes no sean negativos.

    La información clave que el algoritmo mantiene durante la operación es un conjunto de conjuntos de nodos S. Se ha encontrado la ruta más corta desde el punto fuente s hasta cada nodo del conjunto.

    El algoritmo selecciona repetidamente el nodo u con la estimación de ruta más corta del conjunto de nodos VS, agrega u al conjunto S y luego relaja todos los bordes a partir de u.

 

Implementación de algoritmo:

La matriz dist registra la distancia más corta desde el punto fuente al nodo en la figura. La distancia inicial es infinita y establece dist [inicio] = 0 para que comience el algoritmo.

Cuando el nodo u se une al conjunto S, el precursor de u en esta ruta ya debe estar en el conjunto S.

int edge [N] [N]; 

int dist [N]; // la distancia más corta 
int bset [N]; // si la marca ya está en el conjunto S 
int pre [N]; // registra el precursor 

const int INF = 999999999; 

void Dijkstra (inicio) 
{ 
    fill (dist, dist + N, INF); 
    fill (bset, bset + N, 0); 

    dist [start] = 0; 

    for (int i = 0; i <N; i ++) 
    { 
        int min = INF; 
        int u = -1; 

        for (int j = 0; j <N; j ++) 
        { 
            if (bset [j] == 0 && dist [j] <min) 
            { 
                u = j; 
                min = dist [j ]; 
            } 
        } 

        if (u == -1) continuar; 
        bset [u] = 1;

        for (int j = 0; j <N; j ++) 
        { 
            if (bset [j] == 0) 
            { 
// Operación de relajación if (dist [u] + edge [u] [j] <dist [j]) { dist [j] = dist [u] + edge [u] [j]; pre [j] = u; } else if (dist [u] + edge [u] [j] == dist [j]) { / / Explique que hay varias rutas más cortas a este nodo } } } } }

 

Prueba de corrección del algoritmo:

    En el gráfico dirigido ponderado G = (V, E), S es inicialmente un conjunto vacío.

    Tenemos que demostrar que: para el uno al unirse a los nodos del conjunto S es U, S u la distancia a la distancia más corta.

    Supongamos que ud es la distancia de s a u, y δ (s, u) es la distancia más corta de s a u, es decir:

         En el uno al unirse nodo u conjunto S es , ud = δ (s, u )

    Aquí se usa la prueba de contra-evidencia:

        Hipótesis: el nodo u es el primer nodo agregado al conjunto S tal que ud ≠ δ (s, u)

        El nodo fuente s es el primer nodo agregado al conjunto S, y sd = δ (s, s) = 0, el nodo u debe ser diferente del nodo s, es decir u ≠ s.

        Según el algoritmo, cuando se agrega u a S, debe haber una ruta desde el nodo s hacia u, y el nodo precursor de u está en el conjunto S, que se denota como P1.

        Por supuesto de entenderse, también hay una más de u a s de la trayectoria corta, este camino no es necesariamente un precursor de u conjunto S (de lo contrario proceso de relajación encontrará la ruta de acceso), la ruta se conoce como P2.

        En la actualidad, u debería colocarse en S, yb es el nodo fuera del conjunto S.

        

        Saber de la suposición: xd = δ (s, x)

                  ad = δ (s, x)

        Debido a que P2 <P1, dist [b] <dist [u] puede deducirse, entonces b entrará antes que u, creando una contradicción.

    

Supongo que te gusta

Origin www.cnblogs.com/yanghh/p/12685278.html
Recomendado
Clasificación