تخطَّ إلى المحتوى

Floyd-Warshall Algorithm

خوارزمية Floyd-Warshall Floyd-Warshall Algorithm

خوارزمية Floyd-Warshall تحسب أقصر مسار بين كل زوج من العقد دفعة واحدة ببرمجة ديناميكية، بتعقيد O(V³)، وتتعامل مع أوزان سالبة بلا دورة سالبة.

لكل عقدة وسيطة k (بالترتيب من 0 إلى V-1)، تُحدَّث مصفوفة المسافات dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) لكل زوج (i, j) — أي تجربة هل المرور عبر k يعطي مسارًا أرخص. ترتيب حلقة k كحلقة خارجية أساسي لصحة النتيجة.

الصياغة

for k in range(V):
    for i in range(V):
        for j in range(V):
            if dist[i][k] + dist[k][j] < dist[i][j]:
                dist[i][j] = dist[i][k] + dist[k][j]

📄 مثال

def floyd_warshall(V, edges):
    INF = float("inf")
    dist = [[INF] * V for _ in range(V)]
    for i in range(V):
        dist[i][i] = 0
    for u, v, w in edges:
        dist[u][v] = w
    for k in range(V):
        for i in range(V):
            for j in range(V):
                if dist[i][k] + dist[k][j] < dist[i][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]
    return dist

edges = [(0, 1, 3), (1, 2, 1), (0, 2, 10)]
print(floyd_warshall(3, edges))  # [[0, 3, 4], [inf, 0, 1], [inf, inf, 0]]

أهم النقاط

النقطةالوظيفة
التعقيد الزمنيO(V³)
التعقيد المكانيO(V²) — مصفوفة المسافات الكاملة
كشف الدورة السالبةبعد التشغيل، dist[i][i] < 0 لأي عقدة i يكشف دورة سالبة تمرّ بها

💡 نصائح عملية

  • استخدمها فقط عندما تحتاج فعلًا مسافات كل الأزواج على رسم صغير إلى متوسط الحجم؛ لرسم كبير جدًا شغّل Dijkstra من كل مصدر بدلًا منها

⚠️ أخطاء شائعة

  • وضع حلقة k في غير الترتيب الخارجي — يكسر منطق البرمجة الديناميكية ويعطي نتائج خاطئة

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.