Hledání silně souvislý komponent Silně souvislá komponenta orientovaného grafu G= (V,E) je maximální množina uzlů UV taková že ∀ u,v ∈ V : u je dosažitelné z v a v je dosažitelné z u
Známé algoritmy a jejich složitost ● Tarjan (1972) – složitost (V + E) ● Double DFS – složitost (V + E) Je zřejmé, že jejich složitost je zároveň dolní hranice tohoto problému
Double DFS ● Je založen na aplikaci DFS ● Algoritmus využívá transponovaný graf G T ● Grafy G a G T mají shodné SCC ● Po provedení 2. DFS jsou hledané komponenty tvořeny vrcholy jednotlivých DFS stromů
SCC(G) 1.Zavolej DFS(G), který spočítá koncový čas pro každý vrchol 2.Spočitej transponovaný graf G T 3.Zavolej DFS(G T ), ale vrcholy uvažu v pořadí klesajících koncových časů spočitaných v 1. 4.Výstup jsou komponenty tvořeny vrcholy jednotlivých DFS stromů spočitaných v 3.
Provedeme 1.DFS
0/ 0
2/ 0 0/ 0 1/ 0 0/ 0
2/ 0 3/ 4 1/ 0 0/ 0
2/ 5 3/ 4 1/ 0 0/ 0
6/ 0 2/ 5 3/ 4 1/ 0 0/ 0
6/ 0 2/ 5 3/ 4 1/ 0 7/ 8
6/ 9 2/ 5 3/ 4 1/ 0 7/ 8
6/ 9 2/ 5 3/ 4 1/ 1 0 7/ 8
Transponujeme graf Provedeme 2.DFS na transponovaném grafu ale v hlavní cyklu DFS uvažujeme vrcholy v pořadí klesajících koncových časů spočitaných v 1. DFS
Vrcholy jednotlivých DFS stromů tvoří hledané sylně souvislé komponenty
Robert E. Tarjan (*1948) ● studoval na California Institute of Technology (B.S.) a Stanford University (M.S. a Ph.D.) ● Publikoval přes 170 článků, vymyslel řadu alogritmů (převážně z oblasti grafových algoritmů), zabýval se datovými strukturami. ● Algoritmus pro SCC publikován v: Robert E. Tarjan, Depth-first search and linear graph algorithms, SIAM Journal on Computing, 1(2): , 1972.
Tarjanův algoritmus pro SCC ● Je založený na DFS. ● Vrcholy v grafu si indexuje podle pořadí v jakém je navštěvuje (visit), u každého vrcholu si také pamatuje vrchol s nejnižším indexem, ke kterému existuje z tohoto vrcholu cesta (low-link). ● Při první návštěvě vrcholu nastaví low-link = visit, při dalším prohledávání upravuje low-link na odpovídající hodnotu. ● Navštívené vrcholy postupně ukládá na zásobník (kde jsou seřazeny podle jejich hodnoty visit). ● Když se rekurzívní volání DFS vrátí zpět k takovému vrcholu, u kterého platí visit = low-link (tedy vrchol s nejnižším indexem, ke kterému vede z toho vrcholu cesta, je on sám), tak se odstraní všechny vrcholy ze sásobníku až po tento vrchol – tvoří totiž silně spojitou komponentu.
Příklad
Srovnání obou algoritmů