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
أوزان الحواف: تمثل matrix[i][j] وزن الحافة من i إلى j، أو -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]]