Información personal sobre el algoritmo de Floyd

Información personal sobre el algoritmo de Floyd

  Debido a que hay una tarea de algoritmo que se entregará recientemente, miré el título y era aproximadamente el camino más corto con pesos. Entonces pensé en el algoritmo de Freud, así que fui a ver a Baidu y hacer un resumen.
  Si vamos a viajar, definitivamente queremos evitar el camino equivocado, entonces tenemos que saber la distancia más corta entre dos lugares.
Inserte la descripción de la imagen aquí
  Hay ocho caminos para llegar a estos cuatro lugares. Tenga en cuenta que estos caminos son de un solo sentido. Ahora necesitamos preguntar por la distancia más corta entre dos ciudades, es decir, encontrar el camino más corto entre dos puntos. Este problema también se conoce como el problema de la " ruta más corta de múltiples fuentes ".
  Ahora necesitamos una matriz bidimensional para almacenarlo y podemos crear una matriz de 4 * 4. Por ejemplo, la distancia de la ciudad 1 a la ciudad 2 es 2, luego e [1] [2] se establece en 2. Ciudad 2 no puede Para llegar a la ciudad nº 4, establezca el valor de e [2] [4] en ∞. Además, se acuerda aquí que una ciudad es propia y también es 0, por ejemplo, e [1] [1] es 0, como sigue. Inserte la descripción de la imagen aquí
  Sabemos que si quieres acortar la distancia entre dos puntos, solo tienes que introducir un punto de tránsito (vértice k) para acortar la distancia (es decir, a-> k-> b). A veces pueden ser necesarios dos puntos de tránsito o más. Para hacer la ruta más corta, es decir, para introducir k1, k2, k3, etc. (es decir, a-> k1-> k2 ...-> k-> i ...-> b), por ejemplo, la ruta original 4-> 3 es 12. Si se convierte en 4-> 1-> 3 después de 1 pasada, entonces la distancia se convierte en 11 (es decir, e [4] [1] + e [1] [3] = 5 + 6 = 11). Así que ahora convierta el problema en una situación general.

  • Sin pasar por otro punto de tránsito
    Inserte la descripción de la imagen aquí

  •   ¿Qué debo hacer si paso por el punto de tránsito 1 y solo paso por el punto de tránsito 1? Simplemente juzgue si e [i] [1] + e [1] [j] es menor que e [i] [j], e [i] [j] significa desde el vértice i al vértice j La distancia entre ellos. e [i] [1] + e [1] [j] representa la suma de la distancia del vértice i al vértice 1, y luego del vértice 1 al vértice j. El código se implementa de la siguiente manera.
for (i = 1; i <= n; i++)
{
    
    
     for (j = 1; j <= n; j++)
      {
    
    
      	  //循环是遍历整个矩阵,判断每个点经过1是否会变小
          if (e[i][j] > e[i][1] + e[1][j])
              e[i][j] = e[i][1] + e[1][j];
      }
}

Después de pasar 1, la tabla de rutas se actualiza de la siguiente manera:
Inserte la descripción de la imagen aquí
  A través de la figura anterior, podemos encontrar que la distancia de los tres lugares marcados en blanco a otros puntos después de pasar 1 se acorta.


  •   ¿Qué sucede si solo pasamos 1 y 2 en secuencia después de pasar el punto de tránsito 1 y 2? Necesitamos determinar si la distancia entre el vértice i y el vértice j se puede acortar si pasamos a través del vértice No. 2 bajo el resultado de permitir la distancia más corta entre dos puntos cualesquiera al pasar el vértice No. 1. Es decir, para determinar si e [i] [2] + e [2] [j] es menor que e [i] [j], el código se implementa de la siguiente manera.
//经过1号顶点
for(i=1;i<=n;i++)
{
    
    
	for(j=1;j<=n;j++)
	{
    
    
		if (e[i][j] > e[i][1]+e[1][j])  e[i][j]=e[i][1]+e[1][j];
	}
}

//经过2号顶点
for(i=1;i<=n;i++)
{
    
    
	for(j=1;j<=n;j++)
	{
    
    
		if (e[i][j] > e[i][2]+e[2][j])  e[i][j]=e[i][2]+e[2][j];
	}
}

  En el caso de que solo se permitan los vértices 1 y 2, la distancia más corta entre dos puntos cualesquiera se actualiza a:
Inserte la descripción de la imagen aquí
  Podemos encontrar que el 4-> 3 anterior ha cambiado a 11 después de 1 (4-> 1-> 3), y ahora Después de 2 (4-> 1-> 2-> 3), se convierte en 10,

  • Lo
      mismo se aplica a los puntos de tránsito 1, 2 y 3, y la distancia más corta entre dos puntos cualesquiera se encuentra bajo la condición de que solo se permita el tránsito de los vértices 1, 2 y 3. La distancia más corta entre dos puntos cualesquiera se actualiza a:
    Inserte la descripción de la imagen aquí
  • Después de todos los puntos de transferencia,
      todos los vértices pueden pasar como una transferencia. La distancia final más corta entre dos puntos es:
    Inserte la descripción de la imagen aquí
    todo el proceso se puede simplificar en unas pocas líneas de código:
for(k=0; k<n ; k++){
    
     //简单的说就是更新二维矩阵,将任何一个点经过任何一个中间点之后的路程更新为最短的距离
                            //一句话概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。
        for(i =0; i<n; i++){
    
    
        for(j=0; j<n; j++){
    
    
            if(e[i][j] > (e[i][k] + e[k][j])){
    
     
                e[i][j] = e[i][k] + e[k][j];
            }
        }
    }
    }

  La anterior es la distancia más corta a cualquier punto después de pasar todos los puntos de tránsito. En pocas palabras, es la distancia más corta desde el vértice i al vértice j a través de solo los primeros k puntos.

Supongo que te gusta

Origin blog.csdn.net/qq_45125250/article/details/109791793
Recomendado
Clasificación