A Suurballe -féle algoritmus egy olyan algoritmus, amely két nem metsző (nincs közös él) útvonalat keres egy irányított gráfban , nem negatív súllyal úgy, hogy mindkét út ugyanazt a csúcspárt köti össze, és minimális közös hosszuk legyen [1] .
Az algoritmust John Suurballe javasolta, és 1974-ben publikálták [2] . A Suurballe algoritmusának fő ötlete az, hogy Dijkstra algoritmusát használja az elérési út megkeresésére, a gráf élsúlyainak módosítására, majd a Dijkstra algoritmus másodszori futtatására. Az algoritmus kimenete két útvonal kombinálásával, az ezen utak által ellentétes irányban áthaladó élek eldobásával, a fennmaradó élek felhasználásával pedig olyan útvonalak kialakításával jön létre, amelyek az algoritmus kimeneteként szolgálnak.
A súlymódosítás hasonló a Johnson-algoritmusban alkalmazott súlymódosításhoz, és a súlyokat nem negatívan tartja, lehetővé téve a Dijkstra-algoritmus második példányának, hogy megtalálja a helyes második utat.
A minimális súllyal rendelkező két diszjunkt út megtalálásának problémája a minimális költségű áramlási probléma speciális esetének tekinthető , ahol van egy kettes méretű "áramlás", amelynek mindegyik élének egységnyi "kapacitása" van. A Suurballe-féle algoritmus a minimális költségű áramlási algoritmus egy speciális eseteként is felfogható, amely ismételten a lehető legnagyobb áramlást haladja át a legrövidebb úton.
A Suurballe algoritmusa által talált első út a kezdeti (nulla) áramlás legrövidebb útja, a Suurballe algoritmusa által talált második út pedig a maradék gráf legrövidebb útja, miután az egységáramot áthaladta az első útvonalon.
Legyen G súlyozott irányított gráf V csúcskészlettel és E élhalmazzal (A ábra). Legyen s forrás G -ben , t pedig nyelő. Legyen minden él ( u , v ) E - ben az u csúcstól a v csúcsig egy nem negatív w ( u , v ) költséggel .
Határozzuk meg d( s , u ) -t az s csúcsból az u csúcshoz vezető legrövidebb út költségeként az s -ben gyökerező legrövidebb útfában ( C ábra).
Megjegyzés: A csomópontot és a csúcsot gyakran felcserélve használják.
A Suurballe algoritmus a következő lépéseket hajtja végre:
A következő példa bemutatja, hogy a Suurballe algoritmusa hogyan találja meg a legrövidebb nem átfedő útvonalpárt A - tól F -ig .
Az A ábra egy súlyozott G grafikont mutat .
A B ábra kiszámítja a legrövidebb P 1 utat A -tól F -ig ( A - B - D - F ).
A C ábra mutatja az A -ban gyökerező legrövidebb T útfát és az A - tól bármely csúcsig ( u ) számított távolságokat .
A D ábra a G t maradék gráfot mutatja az egyes élek frissített költségével és a P 1 út élei megfordítva.
Az E ábra kiszámítja a G t ( A - C - D - B - E - F ) maradék gráfban a P 2 utat.
Az F ábra mindkét P 1 és P 2 utat mutatja .
A G ábra a P 1 és P 2 utak éleinek kombinálásával és a két út ( B - D ) közötti közös, egymással ellentétes ívek elvetésével találja meg a nem metsző (él) utak legrövidebb párját . Ennek eredményeként a legrövidebb nem metsző útpárt kapjuk ( A - B - E - F ) és ( A - C - D - F ).
Az s -től t -ig tartó bármely út súlya a módosított súlyrendszerben megegyezik az eredeti gráf súlyával mínusz d( s , t ) . Ezért a súlyok módosítása után a két legrövidebb nem metsző út ugyanaz a két legrövidebb út lesz az eredeti gráfban, bár a súlyozás eltérő lesz.
A Suurballe-féle algoritmus a legrövidebb út módszereinek egy speciális eseteként fogható fel egy minimális költségáram megtalálására , amelynek teljes áramlása s és t között kettő . A súlyok módosítása nem befolyásolja az algoritmus által talált utakat, csak azok súlyát. Így az algoritmus helyessége a legrövidebb út megtalálásának módszerének helyességéből következik.
Ehhez az algoritmushoz a Dijkstra-algoritmus két iterációja szükséges. Fibonacci kupacok használata esetén mindkét iteráció időben befejezhető , ahol és a csúcsok és élek száma. Így ugyanezek a korlátok vonatkoznak a Suurballe-féle algoritmusra is.
A Suurballe-algoritmus egy változata, amint azt fent leírtuk, olyan útvonalakat talál, amelyek nem osztoznak éleken, de esetleg osztoznak csúcsokon. Ugyanezt az algoritmust használhatja olyan utak keresésére, amelyeknek nincs közös csúcsuk, ha minden csúcsot egy pár szomszédos csúcsra cserél, az egyikben a forráscsúcs összes bejövő u-in íve , a másikban az összes kimenő u-out ívével . Két közös él nélküli út ebben a módosított gráfban szükségszerűen megfelel két közös csúcs nélküli útnak az eredeti gráfban, és fordítva, így a Suurballe-algoritmusnak a módosított gráfra történő alkalmazása az eredeti gráfban közös csúcsok nélküli két út felépítéséhez vezet. A Suurballe eredeti, 1974-es algoritmusa egy út nélküli változat volt, amelyet 1984-ben Suurballe és Tarjan kiterjesztett egy út nélküli él nélküli verzióra [3] .
Dijkstra algoritmusának egy módosított változatát használva, amely egyidejűleg számítja ki a távolságokat a G t gráfok minden t csúcsától, az is lehetséges, hogy az adott s csúcstól a gráf bármely másik csúcsáig tartó legrövidebb utak teljes hosszát időarányosan megtaláljuk. a Dijkstra-algoritmus egy futtatásának munkájához.
Megjegyzés: Egy csúcs particionálásával kapott szomszédos csúcspárt nulla költségű orientált ív köti össze a bejövő íveket tartalmazó csúcstól a kimenő ívekkel rendelkező csúcsig. Az s-out lesz a forrás , a t-in pedig a mosogató .