Menu
CoddyTech

Floyd Warshall Algorithm

Un grafo orientato con n nodi, numerati da 0 a n-1, è rappresentato da una matrice n per n: matrix[i][j] è il peso dell'arco dal nodo i al nodo j, oppure -1 quando non esiste alcun arco, e matrix[i][i] è 0. La lunghezza di un percorso è la somma dei pesi dei suoi archi.

Restituisci una matrice n per n la cui voce [i][j] è la lunghezza del percorso più breve dal nodo i al nodo j, oppure -1 quando il nodo j non è raggiungibile dal nodo i.

Funzione

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
i pesi degli archi: matrix[i][j] è il peso dell’arco da i a j, oppure -1 quando non esiste
Restituisceinteger-2d-array
la distanza minima per ogni coppia di nodi, -1 quando non esiste un percorso

Vincoli

  • 1 ≤ n ≤ 100, dove n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Per i ≠ j, matrix[i][j] è -1 (nessun arco) oppure 0 ≤ matrix[i][j] ≤ 1000.
  • I archi sono unidirezionali: matrix[i][j] e matrix[j][i] sono indipendenti.

Esempi

Input
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Output
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Spiegazione
Attraverso il nodo 1, il nodo 0 raggiunge il nodo 2 con costo 6 invece di 11, e il nodo 3 con costo 9. Il nodo 1 raggiunge il nodo 0 passando per il nodo 2 con costo 3. Dal nodo 3 non parte nulla, quindi il suo valore sulla riga è -1 fuori dalla diagonale.
challenge icon

Per approfondire

Dopo aver costruito la tabella, un arco diventa meno costoso. Riesci ad aggiornare ogni distanza in O(n²) invece di eseguire di nuovo i cicli O(n³)?

Ripristina il codice
def shortestDistances(matrix):
    # Scrivi il codice qui

Test #1

Test #2

Argomento

matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]

Output atteso

[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]