Algoritmo Freud desnudo, especificado en el título, y luego elaborar la idea;
Pensamiento freudiano:
Para n nodos, si el nodo actúa como un relé entre cualquiera de los otros dos nodos i, j, la distancia entre i y j se puede acortar y luego actualizar;
Usando tres actualizaciones cíclicas, la complejidad es O (n ^ 3);
#include <iostream> #include <vector> #include <string> usando el espacio de nombres std; const int maxn = 210; const int INF = 10000000; int ma [maxn] [maxn]; int n, m; int st, ed; void init () { fill (ma [0], ma [0] + maxn * maxn, INF); para (int i = 0; i <n; i ++) { ma [i] [i] = 0; } } void floyd () { for (int k = 0; k <n; k ++) { for (int i = 0; i <n; i ++) { for (int j = 0; j <n; j ++) { if (ma [i] [k]! = INF && ma [k] [j]! = INF && ma [i] [k] + ma [k] [j] <ma [i] [j]) { ma [ i] [j] = ma [i] [k] + ma [k] [j]; int main () { while (cin >> n >> m) { init (); int a, b, c; para (int i = 0; i <m; i ++) { cin >> a >> b >> c; ma [a] [b] = ma [b] [a] = c; } cin >> st >> ed; floyd (); if (ma [st] [ed] == INF) cout << -1 << endl; else cout << ma [st] [ed] << endl; } }