Algoritmus szorosan összefüggő komponensek keresésére két köteggel
Egy út alapú algoritmus az erősen kapcsolódó irányított gráfkomponensek megtalálására egy olyan algoritmus, amely mélységi keresést használ két veremmel kombinálva, amelyek közül az egyik az aktuális komponens csúcsait, a másik pedig az aktuális útvonalat tárolja [1] . Ennek az algoritmusnak a változatait Purd [2] , Munro [3] , Dijkstra [4] , Cheriyan, Melhorn [5] és Gabov [6] javasolta . Ezek közül a Dijkstra verziója volt az első, amely lineáris időben futott [7]
Leírás
Az algoritmus mélységi keresést hajt végre egy adott G gráfon , fenntartva két verem, az S és a P (a rekurzív függvények normál hívási veremén kívül). Az S verem tartalmazza az összes olyan csúcsot, amely még nincs hozzárendelve egy erősen kapcsolódó komponenshez, abban a sorrendben, ahogyan a mélységi keresés eléri a csúcsot. A P verem olyan csúcsokat tartalmaz, amelyeknél még nincs meghatározva, hogy melyik összefüggő komponenshez tartozik a csúcs. Az algoritmus a C elért csúcsszámlálót
is használja, amely a csúcsok előrendelésének kiszámítására szolgál.
Amikor a mélységi keresés eléri a v csúcsot , az algoritmus a következő lépéseket hajtja végre:
- A v előrendelési száma C -re van állítva , majd a C növekszik.
- A v csúcs S -be és P -be kerül .
- Minden v -ből egy szomszédos w csúcsra ívelt ívre :
- Ha a w előrendelési száma még nincs hozzárendelve, akkor rekurzívan vizsgálja meg w ;
- Ellenkező esetben, ha w még nincs hozzárendelve egy erősen kapcsolódó komponenshez:
- Sorozatosan emelje ki a csúcsokat P -ből, amíg a P verem tetején lévő elem előrendelési száma kisebb vagy egyenlő w előrendelési számmal .
- Ha v a P verem tetején van :
- Tolja ki a csúcsokat S -ből, amíg a v csúcs ki nem ugrik, és rendelje hozzá a kitolt csúcsokat az új komponenshez.
- Nyomja ki a v -t a P -ből .
Az algoritmus abból áll, hogy a gráf csúcsai között hurkolt, rekurzív keresést indítva minden olyan csúcson, amelyhez nincs előrendelési szám.
Kapcsolódó algoritmusok
A leírt algoritmushoz hasonlóan Tarjan algoritmusa az erősen kapcsolódó komponensek megtalálására is mélységi keresést használ egy verem mellett olyan csúcsok tárolására, amelyek még nincsenek hozzárendelve egyetlen erősen kapcsolódó komponenshez sem, és az algoritmus ezeket a csúcsokat egy új komponensbe helyezi át, amikor az algoritmus befejezi a komponens utolsó csúcsának kiterjesztését. Azonban a P verem helyett Tarjan algoritmusa egy csúcsindexelt előrendelési számokból álló tömböt használ, amely abban a sorrendben van hozzárendelve, ahogyan a csúcsok meglátogatták a mélységi keresés során . Az előrendelési tömb arra szolgál, hogy nyomon kövesse, mikor kell új komponenst létrehozni.
Jegyzetek
- ↑ Sedgewick, 2004 .
- ↑ Purdom, 1970 .
- ↑ Munro, 1971 .
- ↑ Dijkstra, 1976 .
- ↑ Cheriyan, Mehlhorn, 1996 .
- ↑ Gabow, 2000 .
- ↑ A Path-based DFS for Strong Components története Archiválva : 2017. május 20., a Wayback Machine , Harold N. Gabow, elérve: 2012.04.24.
Irodalom
- Cheriyan J., Mehlhorn K. Algoritmusok sűrű gráfokhoz és hálózatokhoz a véletlen hozzáférésű számítógépen // Algorithmica . - 1996. - T. 15 . – S. 521–549 . - doi : 10.1007/BF01940880 .
- Edsger Dijkstra. Ch. 25 // A programozás tudománya . – NJ: Prentice Hall, 1976.
- E. Dijkstra. Programozási fegyelem. - "Mir", 1978. - (Számítógépes szoftver).
- Harold N. Gabow. Útvonal-alapú mélységi keresés erős és kétirányú komponensek után // Information Processing Letters. - 2000. - T. 74 , sz. 3-4 . – S. 107–114 . - doi : 10.1016/S0020-0190(00)00051-X .
- Ian Munro. Irányított gráf tranzitív zárásának hatékony meghatározása // Information Processing Letters. - 1971. - T. 1 . – 56–58 . - doi : 10.1016/0020-0190(71)90006-8 .
- Purdom P., Jr. Egy tranzitív zárási algoritmus // BIT. - 1970. - T. 10 . – 76–94 . - doi : 10.1007/bf01940892 .
- Sedgewick R. 19.8 Erős összetevők a digráfokban // Algoritmusok Java nyelven, 5. rész – Grafikonalgoritmusok. — 3. - Cambridge MA: Addison-Wesley, 2004. - S. 205-216.