súlyozott grafikonok
súlyozott grafikonok
A klasszikus oszlopok minden élek egyenértékűnek tekintendők, és az út hossza megegyezik az élek számát tartalmazza. Azonban a probléma gyakran minden éle megfelel egy paraméter - hossz vagy borda érték halad át rajta. A grafikonon a terminológia mint nevezett paraméterrel a tömeg a borda, és egy grafikon miután súlyozott élek súlyozott.
Tipikus probléma az ilyen grafikonok - megtalálja a legrövidebb utat. Például, ez a grafikon a legrövidebb út között a csúcsok $ 1 $, és $ 5 $: $ 1 - 4 - 3 - 5 $, mivel súlya egyenlő $ 30 + 20 + 10 = 60 $, és a tömeg borda $ 1 - $ 5 egyenlő $ 100 $.
Dijkstra algoritmusa
Az elv az algoritmus hasonlít az elvet a BFS: legközelebbi még nincs feldolgozva vertex feldolgozása minden lépésben (a távolság a már ismert). Ha ez még mindig nem kezeli a látogatott szomszédok hozzáadunk sorban, hogy látogassa meg (a távolság, hogy mindegyikre kell kiszámítani a távolságot az aktuális csomópont + élhosszúságú). A fő különbség a BFS, hogy a prioritási sor helyett alkalmazzák a klasszikus felállás. Ez lehetővé teszi számunkra, hogy válasszon a legközelebbi csúcs $ O (\ log N) $.
Animáció végre Dijkstra algoritmus megtalálása a legrövidebb út a csúcs $ a $ és $ b $ top:
Használata ál Dijkstra-algoritmus a következőképpen írja le:
Mint látható, összhangban a kiemelt tárolt nemcsak a felső szám, hanem számított a távolságot, és amelynek rendezési végzik. Az is lehetséges, hogy ahol egy és ugyanazon csomópont kerül a helyére többször, különböző hosszúságú (ahogy ez megvalósítható több bordák). Ebben a helyzetben, kezeljük csak egyszer (a lehető legkisebb távolság).
végrehajtás
A prioritási sort kell tárolni pár (top, a távolság is), sőt azokat meg kell rendelni, hogy csökkentse a távolságot. Ehhez használja az adott std :: priority_queue
A tárolási formájában súlyozott gráf szomszédossági listáját minden vertex tárolunk vektor párokat (szomszéd vertex, élhosszúságú előtte).
Végrehajtás C ++:
Végrehajtása helyreállítási útvonal
Recovery útvonal Dijkstra algoritmust az ugyanúgy, mint a BFS: miközben sikeresen javítása az utat a tetején a $ u $ fölött $ v $, emlékezünk, hogy $ dok [v] = u $. Miután vége az algoritmus segítségével egy sor játékok dok $ $ helyreállítására utat az ellenkező irányba.
Végrehajtás C ++:
Scope Dijkstra algoritmus
Dijkstra algoritmus a legjobb módja annak, hogy keresni szinte minden grafikonok, de van egy korlátozás. Dijkstra algoritmus nem alkalmazható a grafikonok tartalmazó széleit egy negatív súlyt. Ahhoz, hogy megtalálja a legrövidebb utat az ilyen grafikonok általánosan használt algoritmus Bellman-Ford.