grafice ponderate

grafice ponderate

În coloanele clasice toate muchiile sunt considerate a fi echivalente, iar lungimea traseului corespunde numărului de muchii pe care le conține. Cu toate acestea, o problemă de multe ori fiecare muchie corespunde unui parametru - valoarea lungimii sau nervură care trece prin ea. In graficul terminologie, cum parametru numit greutatea nervurii și un grafic având ponderate muchii ponderate.

O problemă tipică pentru aceste grafice - găsi calea cea mai scurtă. De exemplu, în acest grafic cel mai scurt drum între nodurile $ 1 $ și $ 5 $: $ 1 - 4 - 3 - 5 $, deoarece greutatea sa este egală cu 30 + 20 + 10 = 60 $ $, iar greutatea coaste $ 1 - $ de 5 este egal cu $ 100 $.

Algoritmul lui Dijkstra

Principiul algoritmului seamănă cu principiul BFS: cel mai apropiat care nu sunt încă nod procesat este procesat la fiecare pas (distanța până la acesta este deja cunoscut). În cazul în care nu este încă de manipulare a vizitat vecinii sunt adăugate la o coadă pentru a vizita (distanța până la fiecare dintre ele se calculează ca distanța de la nodul curent + lungimea de margine). Diferența principală de la BFS este că coada de prioritate este folosit în loc de gama clasic. Aceasta ne permite să alegeți cel mai apropiat vârf de $ O (\ log N) $.

Animație efectua algoritmul lui Dijkstra pentru a găsi calea cea mai scurtă de la vârf $ a $ a $ b $ de top:

Folosind pseudo algoritmul lui Dijkstra este descrisă după cum urmează:

După cum puteți vedea, în conformitate cu prioritatea stocată nu numai numărul de top, dar, de asemenea, calculat distanța până la ea, și prin care se realizează sortarea. De asemenea, este posibil ca, în care unul și același nod va fi pus în aplicare de mai multe ori cu diferite lungimi (așa cum este realizabil pentru mai multe coaste). În această situație, vom trata doar o singură dată (cu o distanță minimă posibilă).

punerea în aplicare

coada noastră prioritate ar trebui să fie stocate în pereche (de sus, distanța până la ea), de altfel acestea ar trebui să fie obligată să reducă distanța. Pentru a face acest lucru, utilizați tipul std :: priority_queue, vector>, O mai mare>>. primul element al perechii este distanța, iar al doilea - numărul nodurilor.

Pentru depozitare sub forma unei liste de adiacenta grafic ponderată pentru fiecare nod depozitam perechile vectoriale (vertex vecin, lungime margine înainte de a).

Punerea în aplicare pe C ++:

Punerea în aplicare a unei căi de recuperare

calea de recuperare pentru algoritmul Dijkstra este pus în aplicare în același mod ca și pentru BFS: îmbunătățind în același timp cu succes modul în partea de sus a $ u $ peste partea de sus $ v $, să ne amintim că $ anterioare [v] = u $. După încheierea algoritmului folosind o serie de jocuri anterioare $ $ pentru calea de recuperare în direcția opusă.

Punerea în aplicare pe C ++:

Domeniul de aplicare Dijkstra Algoritmul

Algoritmul lui Dijkstra este cel mai bun mod de a căuta aproape orice grafice, dar are o restricție. Algoritmul Dijkstra nu este aplicabil pentru graficele care cuprind margini cu o greutate negativă. Pentru a găsi calea cea mai scurtă în astfel de grafice sunt utilizate în mod obișnuit algoritmul de Bellman-Ford.

articole similare