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)