Algoritmul lui Tarjan
Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită pe 14 iunie 2022; verificările necesită
5 modificări .
Algoritmul lui Tarjan este un algoritm pentru găsirea componentelor puternic conectate într-un digraf care rulează în timp liniar.
Acest algoritm se bazează pe:
- Vârfurile sunt considerate în ordine topologică inversă, astfel încât la sfârșitul funcției recursive pentru vârful inițial, nu va fi întâlnit niciun vârf din aceeași componentă puternic conectată, deoarece toate vârfurile accesibile de la vârful original au fost deja procesate.
- Feedback-urile dintr-un arbore oferă o a doua cale de la un vârf la altul și conectează componentele puternic conectate într-una singură.
Descrierea informală a algoritmului
Algoritmul lui Tarjan poate fi înțeles ca o variație a algoritmului de căutare în profunzime , în care se efectuează pași suplimentari atunci când un nod este vizitat și procesarea nodului este finalizată. O vizită la un vârf are loc atunci când se trece de la rădăcină la frunze, iar sfârșitul procesării vârfului are loc la întoarcere. Când un vârf este vizitat, acesta este împins în stiva auxiliară; atunci când o componentă puternic conectată este procesată, toate vârfurile sale sunt împinse din această stivă [1] .
Algoritm în pseudocod
// date de intrare: grafic direcționat G = (V, A)
// date de ieșire: set de componente puternic conectate
index := 0
stivă := []
pentru fiecare v din V face
dacă v .index = null atunci
strongconnect( v )
function strongconnect( v )
// În index stocăm numărul de vârfuri procesate anterior, v.index este „timpul de intrare” la vârf v
v .index := index
v .lowlink := index
index := index + 1
stivă .push( v )
// Câmpul onStack este necesar pentru a verifica dacă partea de sus aparține stivei din O(1)
v .onStack := true
// Iterează peste arcele care ies din v
pentru fiecare ( v , w ) în A do
if w .index = null atunci
// Vârful w nu a fost vizitat înainte; rulați recursiv din el
strongconnect( w )
v .lowlink := min( v .lowlink, w .lowlink)
altfel dacă w .onStack atunci
// Vertex w este pe stivă, deci aparține aceleiași componente puternic conectate ca v
/ / Dacă w nu este pe stivă, atunci arcul ( v , w ) duce la componenta puternic conectată procesată anterior și ar trebui ignorată
// Notă: următoarea linie folosește în mod deliberat w.index în loc de w.lowlink - aceasta se referă la Articolul original al lui Tarjan
/ / Dacă înlocuim w.index cu w.lowlink, algoritmul rămâne corect
v .lowlink := min( v .lowlink, w .index)
// Vârful v este rădăcina componentei curente puternic conectate, toate vârfurile din stiva de la v și mai sus formează această componentă
dacă v .lowlink = v .index atunci
creați o nouă componentă puternic conectată
repetă
w := stivă .pop()
w .onStack := fals
adăugați w la componenta curentă puternic conectată
în timp ce w ≠ v
scoateți componenta curentă puternic conectată
Orele de deschidere
Algoritmul are complexitate în timp , unde este numărul de arce și sunt vârfurile graficului [1] .
Vezi și
Algoritmul de căutare a componentelor Strongly Connected Two-Stack este un algoritm similar care utilizează căutarea în profunzime.
Note
- ↑ 1 2 Jeremy Sik et al., 2006 .
Link -uri
Literatură
- Tarjan RE Algoritmi de căutare în profunzime și grafic liniar // SIAM Journal on Computing. - 1972. - Vol. 1 , nr. 2 . - P. 146-160. - doi : 10.1137/0201010 .
- Robert Sedgwick. Graph algorithms = Algoritmi grafici. - Ed. a 3-a. - Rusia, Sankt Petersburg: "DiaSoftUP" , 2002. - S. 496. - ISBN 5-93772-054-7 .
- Jeremy Sik, Lai Kwang Lee, Andrew Lumsdane. Biblioteca de grafice C++ Boost. - Petru, 2006. - S. 202-205. — 304 p. — ISBN 5-469-00352-3 .