Menu
CoddyTech

Floyd Warshall Algorithm

נתון גרף מכוון עם n צמתים, שממוספרים מ־0 עד n-1, כמטריצה בגודל n על n: הערך matrix[i][j] הוא המשקל של הקשת מהצומת i לצומת j, או -1 כשאין קשת כזו, ו־matrix[i][i] הוא 0. אורך של מסלול הוא סכום המשקלים של הקשתות שלו.

החזר מטריצה בגודל n על n, שבה הערך [i][j] הוא אורך המסלול הקצר ביותר מהצומת i לצומת j, או -1 כאשר לא ניתן להגיע לצומת j מהצומת i.

פונקציה

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
משקלי הקשתות: <code>matrix[i][j]</code> הוא משקל הקשת מ־<code>i</code> אל <code>j</code>, או ‎-1 כשאין קשת
מחזירהinteger-2d-array
המרחק הקצר ביותר בין כל זוג צמתים, ‎-1 כשאין מסלול

אילוצים

  • 1 ≤ n ≤ 100, כאשר n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • עבור i ≠ j, matrix[i][j] הוא -1 (אין קשת) או 0 ≤ matrix[i][j] ≤ 1000.
  • הקשתות הן חד־כיווניות: matrix[i][j] ו־matrix[j][i] אינן תלויות זו בזו.

דוגמאות

קלט
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
פלט
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
הסבר
דרך צומת 1, צומת 0 מגיע לצומת 2 בעלות 6 במקום 11, ולצומת 3 בעלות 9. צומת 1 מגיע לצומת 0 דרך צומת 2 בעלות 3. שום דבר לא יוצא מצומת 3, ולכן הערך בשורה שלו הוא ‎-1‎ מחוץ לאלכסון.
challenge icon

שאלת המשך

אחרי שבנית את הטבלה, העלות של קשת אחת יורדת. האם תוכל לעדכן כל מרחק ב־O(n²) במקום להריץ שוב את הלולאות של O(n³)?

איפוס הקוד
def shortestDistances(matrix):
    # כתבו כאן קוד

בדיקה #1

בדיקה #2

ארגומנט

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

הפלט הצפוי

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