Algoritmus pro hledání pevně propojených součástí se dvěma sadami
Algoritmus založený na cestě pro nalezení silně propojených složek směrovaného grafu je algoritmus, který používá hledání do hloubky v kombinaci se dvěma zásobníky , z nichž jeden ukládá vrcholy aktuální složky a druhý aktuální cestu [1] . Verze tohoto algoritmu navrhli Purd [2] , Munro [3] , Dijkstra [4] , Cheriyan, Melhorn [5] a Gabov [6] . Z nich byla Dijkstrova verze první, která běžela v lineárním čase [7]
Popis
Algoritmus provádí hloubkové prohledávání daného grafu G , přičemž udržuje dva zásobníky, S a P (kromě normálního zásobníku volání pro rekurzivní funkce). Zásobník S obsahuje všechny vrcholy, které ještě nebyly přiřazeny k silně propojené komponentě v pořadí, ve kterém hloubkové hledání dosáhne vrcholu. Zásobník P obsahuje vrcholy, u kterých ještě není určeno, ke které připojené komponentě vrchol patří. Algoritmus také používá čítač dosažených vrcholů
C , který se používá k výpočtu předběžného pořadí vrcholů.
Když prohledávání do hloubky dosáhne vrcholu v , algoritmus provede následující kroky:
- Číslo předobjednávky v je nastaveno na C a poté se C zvýší.
- Vrchol v je umístěn v S a v P .
- Pro každý oblouk z v do sousedního vrcholu w :
- Pokud předobjednávkové číslo w ještě nebylo přiděleno, rekurzivně naskenujte w ;
- Jinak, pokud w ještě není přiřazeno k silně připojené komponentě:
- Postupně vyskládejte vrcholy z P , dokud prvek v horní části zásobníku P nebude mít číslo předobjednávky menší nebo rovné číslu předobjednávky w .
- Pokud je v na vrcholu zásobníku P :
- Posuňte vrcholy z S , dokud se vrchol v nevysune, a přiřaďte posunuté vrcholy nové komponentě.
- Vytlačte v z P. _
Algoritmus sestává ze smyčkování přes vrcholy grafu, vyvolání rekurzivního vyhledávání na každém vrcholu, který nemá přiřazeno číslo předobjednávky.
Související algoritmy
Podobně jako u popsaného algoritmu, Tarjanův algoritmus pro nalezení silně propojených komponent také používá hloubkové vyhledávání spolu se zásobníkem k uložení vrcholů, které ještě nejsou přiřazeny žádné silně propojené komponentě, a algoritmus přenese tyto vrcholy do nové komponenty, když algoritmus dokončí rozbalení posledního vrcholu komponenty. Namísto zásobníku P však Tarjanův algoritmus používá vertexově indexované pole předobjednávkových čísel přiřazených v pořadí, v jakém jsou vertexy navštěvovány při hledání první hloubky . Pole předobjednávky se používá ke sledování, kdy by měla být vytvořena nová komponenta.
Poznámky
- ↑ Sedgewick, 2004 .
- ↑ Purdom, 1970 .
- ↑ Munro, 1971 .
- ↑ Dijkstra, 1976 .
- ↑ Cheriyan, Mehlhorn, 1996 .
- ↑ Gabow, 2000 .
- ↑ Historie DFS založeného na cestě pro silné komponenty Archivováno 20. května 2017 na Wayback Machine , Harold N. Gabow, přístup 2012-04-24.
Literatura
- Cheriyan J., Mehlhorn K. Algoritmy pro husté grafy a sítě na počítači s náhodným přístupem // Algorithmica . - 1996. - T. 15 . — S. 521–549 . - doi : 10.1007/BF01940880 .
- Edsger Dijkstra. Ch. 25 // Disciplína programování . — NJ: Prentice Hall, 1976.
- E. Dijkstra. Programovací disciplína. - "Mir", 1978. - (Počítačový software).
- Harold N. Gabow. Vyhledávání silných a vzájemně propojených komponent na základě cesty // Information Processing Letters. - 2000. - T. 74 , čís. 3-4 . — S. 107–114 . - doi : 10.1016/S0020-0190(00)00051-X .
- Ian Munro. Efektivní určení tranzitivního uzávěru orientovaného grafu // Information Processing Letters. - 1971. - T. 1 . — s. 56–58 . - doi : 10.1016/0020-0190(71)90006-8 .
- Purdom P., Jr. Algoritmus tranzitivního uzavření // BIT. - 1970. - T. 10 . — s. 76–94 . - doi : 10.1007/bf01940892 .
- Sedgewick R. 19.8 Strong Components in Digraphs // Algorithms in Java, Part 5 - Graph Algorithms. — 3. - Cambridge MA: Addison-Wesley, 2004. - S. 205-216.