پاسخ : کوتاه ترین مسیر در گراف
پستا رو که می خوندم به نظرم از سال 2009 تا الان خیلی مطلب جامعی در مورد این مسئله ارائه نشده من سعی می کنم ی توضیح کاملی ارائه بدم باشد که مفید واقع گردد.
کلا چهار تا الگوریتم معروف برای حل این مسئله وجود داره که هر کدوم جایی کاربرد دارن و نقاط ضعف و قوتی نسبت به بقیه دارن
هر کدوم از اینا رو تو ویکی سرچ کنید همه چی رو درباره شون میاره من فقد نقاط ضعف و قوتشون و رو می گم
1- Floyed-Warshall
یه الگوریتمه داینامیک از (O(n^3 هست[nb]منظور از n و |V| همون تعداد راس و |E| همون تعداد یال هست .[/nb] که پیاده سازی راحتی داره کوتاهترین فاصله بین هر دو راس از گراف رو بعد از اجرا توی ی ماتریس دارین برای تمام گراف ها هم درست کار می کنه (یال های وزن دار حتی منفی به شرطی که دور منفی نداشته باشیم) ایراد این الگوریتم اولا زمان اجراشه ثانیا کوتاهترین مسیر رو تو گراف بین دوتاراس نمی تونید چاپ کنید فقط میتونید طولشو داشته باشید.
2- dijkstra
یه الگوریتم گریدی که برای گراف های با یال وزن دار (وزن های غیر منفی) کوتاهترین مسیر رو ارائه می ده زمانش هم (|O(|E|log|v هست البته با ساختمان داده fibonacci heap می شه با زمان (|O(|v|^2+|v|log|v پیاده ش کرد که زمانش بسته به گراف بین vlogv و v^2 متغیره.
فقط کوتاهترین فاصله بین یک راس و سایر راس ها رو بهتون می ده و خوبی دیگه ای هم داره اینه که می تونید ی درخت dijkstra موقع اجرا درست کنید که بعد از اجرا یکی از کوتاهترین مسیر های بین دو راس رو با یه DFS یا BFS تو درخته چاپ یا ذخیره کنید. اما برای گراف هایی با یال منفی درست کار نمی کنه.
3- Bellman-ford
این الگوریتم برای گراف های با دور منفی هم کوتاهترین مسیر رو چاپ می کنه زمانش هم (|O(|E|*|V و می تونه تشخیص بده بین دو راس یک کوتاهترین مسیر وجود داره یا یک دور منفی وجود دارد (دور منفی باعث ایجاد یک لوپ میشود که کوتاهترین فاصله را در هر مرحله کم تر می کند)
4- BFS
این الگوریتم از (|O(|E هست (E تعداد یال های اون مولفه همبندی مونه البته توی این مسئله خاص زمانش کم شده توی کابرد های دیگه تعداد راس ها و کل یال ها هم مهم می شه) که فقد برای گراف های بی وزن درست کار می کنه در واقع توی این مسئله حالت خاص الگوریتم دایکسترا برای گراف های بی وزنه که عمل سرچ کردن ازش حذف شده و اون logv که به صورت ضرب اومده بود برداشته می شه. چون همه یال های هم وزنن دیگه نیازی به سرچ نیست و سطح به سطح یال ها رو طی می کنیم. :)
پس بچه اون محسوب می شه و برای گراف های بی وزن همون خواص دایکسترا رو داره. :) مثه چاپ مسیر و درخت BFS
خب فک کنم برای کسایی که می خوان برن رو شاخ این مسئله الان بدونن باید چه کار کنن