[Algoritmo de aprendizaje] Algoritmo de Bellman-Ford para encontrar el camino más corto

El algoritmo OAO dijkstra es excelente en términos de complejidad, pero su mayor inconveniente es que no puede manejar gráficos ponderados negativos.

(Debido a que se basa en el hecho de que el borde desde el punto de origen que se ha actualizado debe haber alcanzado el camino más corto, se adopta una estrategia codiciosa para encontrar el camino más corto

Cuando hay un camino de poder negativo, esta base no se establece. )

 

En este momento, se invitará al algoritmo Bellman-Ford

(Prueba de corrección: https://oi-wiki.org/graph/shortest-path/)

Publica un código emm:

#include <bits / stdc ++. h>
 usando el  espacio de nombres std; 

// Bellman-Ford 队列 优化
const  int maxn = 1e5 + 5 ; 

struct edge {
     int a, w; 
}; 

bool book [maxn];
int dis [maxn]; 
cola < int > q; 
vector <edge> bordes [maxn];
int n, m, s;
int u, v, w; 

int main () { 
    cin >> n >> m >> s;
    while (m-- ) { 
        scanf ( " % d% d% d ", & u, & v, & w); 
        bordes [u] .push_back (borde {v, w}); 
    } 
    relleno (dis, dis + n + 1 , 0x3f3f3f3f ); 
    dis [s] = 0 ; 

    libro [s] = 1 ; 
    q.push (s); 
    while (! q.empty ()) {
         int t = q.front (); 
        
        q.pop (); 
        para ( int i = 0 ; i <bordes [t]. tamaño (); i ++ ) {
             if (dis [bordes [t] [i] .to]> dis [t] + bordes [t] [i] .w ) { 
                dis [bordes [t] [i] .to] = dis [t] +bordes [t] [i] .w;
                if (! book [bordes [t] [i] .to]) { 
                    libro [bordes [t] [i] .to] = 1 ; 
                    q.push (bordes [t] [i] .to); 
                } 
            } 
        } 
        libro [t] = 0 ; 
    } 

    para ( int i = 1 ; i <= n; i ++ ) 
        cout << dis [i] << "  " ;
    devuelve  0 ; 
}

Para cada punto de la cola, actualice la distancia desde el punto final correspondiente a todos los bordes salientes hasta el punto de origen

Ponga el punto de la ruta actualizada en la cola

Hasta que no se puedan poner puntos en la cola (es decir, todos los puntos están más cerca del punto de origen)

Entonces, la optimización de la cola de Bellman-Ford (es decir, SPFA) es una optimización inestable, y lo peor se degradará a O (NM) de Bellman-Ford

(Emm significa que los datos especialmente construidos pueden llevar la tarjeta SPFA a T, por lo que si no hay un peso negativo, es mejor llamar a dijkstra)

Supongo que te gusta

Origin www.cnblogs.com/leafsblogowo/p/12700316.html
Recomendado
Clasificación