Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabla de contenido
El algoritmo de Floyd, el nombre completo del algoritmo Floyd-Warshall, es un algoritmo de programación dinámica que se utiliza para resolver el problema del camino más corto entre todos los pares de vértices del gráfico. Es adecuado para gráficos dirigidos ponderados y puede manejar bordes de peso negativos (pero no gráficos que contengan ciclos de peso negativos) y puede detectar si hay ciclos de peso negativos en el gráfico.
La idea central del algoritmo de Floyd es la programación dinámica y sus pasos básicos son los siguientes:
La implementación del algoritmo de Floyd generalmente utiliza un bucle triple. El bucle externo atraviesa todos los vértices intermedios k y los dos bucles internos atraviesan todos los pares de vértices (i, j) para verificar si hay un camino más corto.
Supongamos que tenemos un gráfico ponderado G que contiene n vértices, podemos usar una matriz bidimensionaldist[][]
para almacenar la longitud de ruta más corta entre cada par de vértices. Inicialmente,dist[i][j]
se establece en el peso del borde directamente conectado en el gráfico. Si no hay un borde directamente conectado entre i y j, entonces.dist[i][j]
Establecer en infinito (lo que indica inalcanzable).
inicialización : Cree una matriz D de n × n, donde D [i] [j] se inicializa con el peso del borde directo de i a j en el gráfico, o se establece en infinito si no hay un borde directo entre i y j. Elemento diagonal D[i][i] = 0.
programación dinámica : Para cada vértice k (como vértice intermedio), actualice el camino más corto entre cada par de vértices i y j. Es posible obtener un camino más corto con k como punto intermedio. La fórmula de actualización es: D[i][j] = min(D[i][j], D[i][k] + D[k][j]). Esto significa que si el camino de i a j se acorta a través de k como vértice intermedio, actualice D[i][j].
Salida de resultados: Después de n rondas de iteraciones, cada elemento D [i] [j] en la matriz D es la longitud de camino más corta de i a j.
343. Clasificación - Banco de preguntas AcWing
- #include <algorithm>
- #include <bits/stdc++.h>
- #include <iostream>
- using namespace std;
-
- #define PII pair<int, int>
- #define fi first
- #define se second
- #define endl 'n'
- map<int, int> mp;
-
- const int N = 210, mod = 1e9 + 7;
- int T, n, m, k;
- int a[N], dist[N][N];
- PII ans[N];
-
- void floyd(int x) // 以 x 为中转点,更新其他点。
- {
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= n; j++)
- dist[i][j] = min(dist[i][j], dist[i][x] + dist[x][j]);
- }
-
- bool pd() // 判断是否所有点都已确定
- {
- for (int i = 1; i <= n; i++) {
- int cnt = 0;
- for (int j = 1; j <= n; j++)
- if (dist[i][j] != 1e9)
- cnt++; // 当前点能到达的点数
- ans[i] = {cnt, i};
- for (int j = 1; j <= n; j++)
- if (i != j && dist[j][i] != 1e9)
- cnt++; // 能到达当前点的点数
- if (cnt != n)
- return 0;
- }
- sort(ans + 1, ans + n + 1);
- return 1;
- }
-
- int main() {
- while (cin >> n >> m && n) {
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= n; j++)
- if (i != j)
- dist[i][j] = 1e9;
-
- int flag = 0;
- for (int i = 1; i <= m; i++) {
- char a, t, b;
- cin >> a >> t >> b;
- int x = a - 'A' + 1, y = b - 'A' + 1; // 现在要加一条从 y 到 x 的边
-
- if (!flag && dist[x][y] != 1e9) // 发现已经从x能到y,出现矛盾
- {
- printf("Inconsistency found after %d relations.n", i);
- flag = 1;
- }
-
- dist[y][x] = 1;
- floyd(x), floyd(y); // 分别以 x 和 y 为中转点更新其他点
- if (!flag && pd()) { // 发现所有点都已确定
- printf("Sorted sequence determined after %d relations: ", i);
- for (int i = 1; i <= n; i++)
- cout << char(ans[i].se + 'A' - 1);
- printf(".n");
- flag = 1;
- }
- }
- if (!flag)
- printf("Sorted sequence cannot be determined.n"); // 无法确定
- }
-
- return 0;
- }
dist
La matriz bidimensional se inicializa al infinito, lo que significa que no existe una relación de orden definida entre las desigualdades de forma predeterminada.dist
Matrix, utilizando el algoritmo de Floyd para actualizar el camino más corto entre todas las desigualdades, aquí en realidad está actualizando la relación de "prioridad" u "orden".