Algoritmo de Bellman-Ford de la ruta más corta de una sola fuente: puede manejar bordes de peso negativo y bucles de peso negativo

1. Bellman-Ford (Bellman-Ford) en comparación con el algoritmo de Dijkstra (Dijkstra):

Pros y contras Bellman-Ford Dijkstra
Abordar la situación problemática Puede manejar bordes negativos y bucles Solo puede manejar el lado derecho
complejidad del tiempo Alto, O (V * E) Bajo, O (V ^ 2)
lograr Implementación de código simple Implementación de código complejo

2. Introducción al algoritmo de Bellman-Ford: el algoritmo de
Bellman-Ford puede resolver el problema de la ruta más corta de un solo punto de origen en una situación más general (con bordes de peso negativos).
2.1. Pasos del algoritmo:

  • Inicialización: establezca la distancia del punto de origen en 0 (d [s] -> 0) y establezca la distancia más corta de todos los demás vértices en infinito positivo (d [v] -> + ∞)
  • Solución iterativa:Realice la operación de relajación en cada borde del conjunto de bordes E, Haciendo la estimación de la distancia más corta de cada vértice v en el conjunto de vértices V se aproxima gradualmente a su distancia más corta,Tiempos de ciclo V-1 (encontrando el camino más corto hasta ahora)
  • Pruebe el bucle de peso negativo: realice la relajación V-ésima, si la distancia aún se puede reducir, lo que indica que hay un bucle de peso negativo, el algoritmo devuelve falso, lo que indica que el problema no tiene solución; de lo contrario, el algoritmo devuelve verdadero y la distancia más corta del vértice v alcanzable desde el punto de origen Almacenado en d [v].

2.2 Principio:
Relajación
Cada operación de relajación es en realidad un acceso a los nodos adyacentes.La enésima operación de relajación asegura que todos los caminos con profundidad n sean los más cortos.Dado que la ruta más corta del gráfico no pasará más de los bordes | V | -1 más largos, se repite V-1 veces.
Determinación del anillo de peso negativo
Debido a que el anillo de peso negativo puede reducir el costo total (distancia) sin límite,Si se encuentra que la enésima operación aún puede reducir los costos, debe haber un anillo de peso negativo.

2.3 Optimización:
Salte del ciclo temprano
En la operación real, el algoritmo de Bellman-Ford a menudo resuelve el problema antes de alcanzar | V | -1 veces, y | V | -1 es en realidad el valor máximo. Por lo tanto, puede establecer un juicio en el bucle, agregar una bandera y cuando la relajación ya no esté en un bucle determinado, puede salir directamente del bucle y realizar un juicio de bucle de peso negativo.

3. Pseudocódigo Descripción:
solución diagrama de flujo algoritmo: solución diagrama de flujo algoritmo
web de referencia código Pseudo: principio algoritmo Bellman-Ford

bool BellmanFord(list vertices, list edges, vertex source)
   // 该实现读入边和节点的列表,并向两个数组(distance和predecessor)中写入最短路径信息

   // 步骤1:初始化图
   for each vertex v in vertices:
       if v is source then distance[v] := 0 // 源节点距离为0
       else distance[v] := infinity //其余为正无穷
       predecessor[v] := null // 开始时没有路径

   // 步骤2:重复对每一条边进行松弛操作
   for i from 1 to size(vertices)-1: // V-1次循环
       for each edge (u, v) with weight w in edges: // 每一条边都松弛,边的顺序无关系
           if distance[u] + w < distance[v]:
               distance[v] := distance[u] + w
               predecessor[v] := u

   // 步骤3:检查负权环
   for each edge (u, v) with weight w in edges: 
       if distance[u] + w < distance[v]: // 仍然可以松弛则有负权环
           error "图包含了负权环"

Referencia: Descripción detallada del algoritmo: algoritmo Enciclopedia Baidu-Bellman-Ford

para resumir:

1. El algoritmo de ruta más corta para gráficos no ponderados es BFS;
2. Bellman-Ford se usa cuando la ruta más corta de un gráfico ponderado tiene aristas / anillos negativos;
2. La ruta más corta para una gráfica ponderada se usa cuando no hay aristas / anillos negativos. Dijkstra;

Supongo que te gusta

Origin blog.csdn.net/qq_33726635/article/details/106503058
Recomendado
Clasificación