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 الكامل بالعربي.