Bellman-Ford Algorithm
خوارزمية Bellman-Ford Bellman-Ford Algorithm
خوارزمية Bellman-Ford تجد أقصر مسار من مصدر واحد لكل عقدة أخرى حتى لو وُجدت أوزان سالبة (حيث تفشل Dijkstra)، وتكشف أيضًا وجود دورة سالبة.
تسترخي (Relax) كل ضلع بالرسم البياني V-1 مرة (حيث V عدد العقد) — بعكس Dijkstra التي تعالج العقد بترتيب ذكي عبر طابور أولويّة، هنا تُفحص كل الأضلاع مباشرة بكل جولة. جولة إضافية بعد الـ V-1 تكشف وجود دورة سالبة إن استمر أي ضلع بالتحسّن.
الصياغة
for _ in range(num_nodes - 1):
for u, v, weight in edges:
if dist[u] + weight < dist[v]:
dist[v] = dist[u] + weight📄 مثال
def bellman_ford(edges, num_nodes, start):
dist = {n: float("inf") for n in range(num_nodes)}
dist[start] = 0
for _ in range(num_nodes - 1):
for u, v, weight in edges:
if dist[u] + weight < dist[v]:
dist[v] = dist[u] + weight
for u, v, weight in edges:
if dist[u] + weight < dist[v]:
raise ValueError("يوجد دورة سالبة")
return dist
edges = [(0, 1, 4), (0, 2, 5), (1, 3, -3), (2, 3, 2)]
print(bellman_ford(edges, 4, 0)) # {0: 0, 1: 4, 2: 5, 3: 1}أهم النقاط
| النقطة | الوظيفة |
|---|---|
| التعقيد الزمني | O(V × E) — أبطأ من Dijkstra بوضوح |
| أوزان سالبة | تتعامل معها بشكل صحيح، بعكس Dijkstra |
| كشف الدورة السالبة | جولة استرخاء إضافية بعد الـ V-1: إن حسّنت أي مسافة، توجد دورة سالبة |
💡 نصائح عملية
- استخدم Dijkstra افتراضيًا للأداء، وانتقل لـ Bellman-Ford فقط عند احتمال وجود أوزان سالبة أو حاجة لكشف دورة سالبة
⚠️ أخطاء شائعة
- نسيان جولة الاسترخاء الإضافية لكشف الدورة السالبة — يقبل نتائج قد تكون خاطئة تمامًا بصمت لو وُجدت دورة سالبة فعلًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.