Sterke og 2-sammenhengende komponeneter, DFS

Slides:



Advertisements
Liknende presentasjoner
Hvordan er et atom bygd opp?
Advertisements

@ TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Åsmund Eldhuset asmunde idi.ntnu.no.
TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Kristian Veøy
Kontrollstrukturer (Kapittel 3)
The Travelling Salesperson. LOG530 Distribusjonsplanlegging 2 2 Et forsyningsskip skal starte fra VestBase for å betjene 10 forskjellig installasjoner.
En innføring i spillet: Dobbeltkrig – Grønn
Webprogrammering Arrays.
Korteste vei. LOG530 Distribusjonsplanlegging 2 2 Ofte står en overfor ønsket om å finne korteste kjørerute fra et gitt utgangspunkt til et ønsket bestemmelsessted.
Ulike sorteringsmetoder Kompleksitet av dem
Øvingsforelesning 9 Flytnettverk, maksimum flyt og maksimum bipartitt matching Jon Marius Venstad Redigert og forelest av Gleb Sizov.
Ideutvikling - Problemdefinisjonen. Hva gjør de erfarne problemløserne? •Samler og analyserer informasjon og data •Snakker med mennesker som kjenner problemet.
Forside Korteste sti BFS Modifikasjon Dijkstra Eksempel Korrekthet Analyse Øving Spørsmål Dijkstras algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no.
@ TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Åsmund Eldhuset asmunde idi.ntnu.no.
Dijkstras algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no
Teoriøving 4 (1) Strongly connected component: ”det maksimale settet med noder slik at for alle nodepar (u,v) i settet finnes kantene u -> v og v -> u.
Øvingsforelesning 9 Flytnettverk, maksimum flyt og
1 Øvingsforelesning Andreas Knudsen Nils Grimsmo
Øvingsforelesning 3 Grafer, BFS, DFS og hashing
Korrekt dybde først-søk
Øvingsforelesning 2 Trær og søking i dem, samt litt diverse emner Kristian Veøy
Alg. Dat Øvingsforelesning 3 Grafer, BFS, DFS og hashing Børge Rødsjø
Øvingsforelesning Magnus Haug
INF 295 Forelesning 15 - kap 9 Grafer Hans Fr. Nordhaug (Ola Bø)
Jæger: Robuste og sikre systemer INF150 Programmering mandag 2.10 Default values – standardverdier ved oppstart MER OM: Sub-prosedyrer og sub-funksjoner.
Reiserute med maksimal opplevelse. LOG530 Distribusjonsplanlegging 2 2 I følgende eksempel er det en turist som ønsker å velge kjøreruten med mest severdigheter,
Maksimal gjennomstrømming. LOG530 Distribusjonsplanlegging 2 2 StartOil må transportere store mengder utstyr og materialer til utbyggingen av et nytt.
The Postmans Problem. LOG530 Distribusjonsplanlegging 2 2 Mista har fått i oppdrag å vedlikeholde veiene i landsdelen. Dette er et eksempel på den klassiske.
Klargjøring fra forrige gang
Sortering og søk. Sortering av data som ligger på en fil Prisipielt to hovedmåter gjøre dette på: 1.Arbeide mot filen 1.Lese en linje, og lese de resterende.
INF150 Programmering mandag 11.9
Komplekse tall Naturlige tall
Opplæring: Digital Diktering
Øvingsforelesning 9 - Børge Rødsjø
Algoritmer og Datastrukturer
Kap 07 Stakk I dette kapitlet skal vi se på datastrukturen stakk.
1 Kap 08 Kø. 2 Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan innsetttes kun i den ene enden av listen, kalt bak, og fjernes.
Kap 02 Tabeller / Tabelloperasjoner. Enkeltvariable Les inn nedbørmengde for årets 12 måneder: Les n1 Les n2 … Les n12 n1 n2 n12.
Kap 10 Graf.
INF 295 Algoritmer og datastrukturer Forelesning 7 ADT Lister, Stakker og Køer Hans Fr. Nordhaug (Ola Bø)
INF 295 forelesning 14 - kap 8 Disjunkt mengde ADT Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 9a Søketrær Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 8 Trær Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 16 - kap 9 Minimalt spenntre og korteste vei i grafer Hans Fredrik Nordhaug (Ola Bø)
INF 295 forelesning 13 - kap 6 Andre prioritetskøer Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 18 - kap 9 Aktivitetsgrafer
INF 295 Algoritmer og datastrukturer Forelesning 6 ADT Lister, Stakker og Køer Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 9b Balanserte (binære) trær Hans Fr. Nordhaug.
INF 295 Forelesning 19 - Dynamisk programmering Korteste vei alle til alle (Floyd) Hans Fr. Nordhaug (Ola Bø)
Eksempel på SQL ”SQL-setninger” har en struktur som likner på ”naturlig språk”, med ”verb, subjekter og adjektiver”. SQL-setningene begynner alltid med.
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Hovedfagspresentasjon
Oppgave 1. Automaten aksepterer språket over alfabetet {a,b} bestående av strenger med et like antall forekomster av a og et like antall forekomster av.
INF 4130 Eksamen 2008 Gjennomgang.
Magnus Haug Algoritmer og Datastrukturer
1 INF5110 – 23. april, 2013 Svar på noen oppgaver til kap. 8 Beklager noe trykkfeil og rot på forelesningene Håper dette er bedre (lagt ut 24/4) Nå fredag.
INF 295 forelesning 12 Repetisjon per 17. februar Hans F. Nordhaug (Ola Bø)
Alg. Dat Øvingsforelesning 11 Dynamisk programmering, grådighet
Kontekstfri grammatikk Endelig mengde T av terminal(symbol)er Endelig mengde V av ikke-terminal(symbol)er Startsymbol S Endelig mengde P av produksjoner.
Sorterings- Algoritmer Algoritmer og Datastrukturer.
1 INF oktober 2010 Stein Krogdahl Foreløpige foiler Dagens program: –Første time: Kap 23.5: Trær og strategier for spill med to spillere –Andre.
Routing Indices For P2P Systems TDT2 – Avanserte Distribuerte Systemer Lars-Erik Bjørk.
Praktisk Midtveisevaluering av kurset («femminutterslapper») i pausen. Undervisningsfri neste uke (ingen forelesninger eller grupper). NM i programmering.
Trekkstrukturer Bygges opp fra en mengde trekk f,g,h,… og en mengde atomære verdier a,b,c,… Defineres som en DAG (directed acyclic graph), det vil si en.
Sannsynlighet og kombinatorikk
Lokalisering og max minimumavstand. LOG530 Distribusjonsplanlegging 2 2 Anta at nettverket angir en region hvor McBurger skal opprettes 3 konkurrerende.
Korteste vei. LOG530 Distribusjonsplanlegging 2 2 Ofte står en overfor ønsket om å finne korteste kjørerute fra et gitt utgangspunkt til et ønsket bestemmelsessted.
Matematikk 1 årskurs 26. oktober 2009
Kapittel 12 Samlingar Samlingar og datastrukturar Ei samling (collection) blir brukt til å oppbevare og handtere andre objekt ArrayList – klassen.
1 Øvingsforelesning 4 Topologisk sortering Minimale spenntrær Håkon Jacobsen
INF5110 – 5. og 7. mai 2015 Stein Krogdahl, Ifi, UiO
Utskrift av presentasjonen:

Sterke og 2-sammenhengende komponeneter, DFS Grafer (urettede og rettede) Dybde Først-Søk (DFS) Sammenhengende komponenter v.hj.a DFS Topologisk sortering / Løkker v.hj.a DFS Sterkt sammenhengende komponenter v.hj.a. DFS 2-sammenhengende komponenter v.hj.a. DFS DFS er en veldig nyttig teknikk, andre anvendelser er bla. testing av bipartithet og planaritet.

(urettede) Grafer En graf G=(V,E) består en mengde noder V=V(G), og en mengde kanter E=E(G). Hver kant er et par av noder {u,v}, slik at u,v  V(G). (Vi skriver noen ganger bare uv). En kant {u,v} modellerer at nodene u og v er relatert til hverandre. w u y x v

Rettede grafer En rettet graf D=(V,E) består en mengde noder V=V(G), og en mengde rettede kanter E=E(G). Hver kant er et ordnet par av noder (u,v), slik at u,v  V(G). (Vi skriver noen ganger bare uv). En kant (u,v) modellerer at noden u står i relasjon til v. w u y x v

Rettede grafer En rettet graf D=(V,E) består en mengde noder V=V(G), og en mengde rettede kanter E=E(G). Hver kant er et ordnet par av noder (u,v), slik at u,v  V(G). (Vi skriver noen ganger bare uv). En kant (u,v) modellerer at noden u står i relasjon til v. En rettet graf uten (rettede) løkker kalles ofte en DAG (directed, acyclic graph). w u y x v

Sammenhengende grafer Grafer kan være sammenhengende, eller usammenhengende (bestående av flere komponenter). En urettet graf er sammenhengende dersom det for ethvert par av noder u og v, finnes en sti mellom u og v. Rettede grafer kan selvsagt også være usammenhengende, vi ser da på stier i den underliggende, urettede grafen.

Grafer Grafer er den mest fleksible datastrukturen vi kjenner (”alt” kan modelleres med grafer). Grafer finnes i mange problemer i dagliglivet Datanettverk Ruteplanlegging VLSI (dagliglivet?) …

DFS Malen for et dybde først-søk ser slik ut: proc DFS(v) { v.visited=TRUE for <hver nabo w av v> do if not w.visited then DFS(w) od }

DFS Malen for et dybde først-søk ser slik ut: proc DFS(v) prenummer { v.visited=TRUE for <hver nabo w av v> do if not w.visited then DFS(w) od } prenummer postnummer

DFS Malen for et dybde først-søk ser slik ut: proc DFS(v) prenummer { v.visited=TRUE for <hver nabo w av v> do if not w.visited then DFS(w) od } prenummer postnummer 0 4 0 4 w 1 2 1 2 w u 4 3 u 4 3 y 2 1 y 3 0 v 2 1 x v 3 0 x

Sammenhengende komponenter DFS kan brukes til å sjekke om en graf G er sammenhengende eller ei. Start et dybde først-søk i en node. Merk nodene når de aksesseres. Er alle nodene merket når søket er over, er grafen sammenhengende. Hvis ikke, finn en umerket node og fortsett med et nytt merke.

Topologisk sortering / løkkesøk En topologisk sortering er en ordning av nodene i en graf, slik at hvis det finnes en sti fra u til v, så kommer u før v i sorteringen. (Ikke unik, flere mulig ordninger kan være lovlige.) Har vi en rettet graf D, kan vi bruke DFS til å finne en topologisk sortering av nodene i grafen, evt. fremvise en løkke i D. (Grafer med løkker kan ikke sorteres topologisk. Hvilken node i sykelen skulle i så fall komme først?) MA100 INF101 MA008 INF111 MA-IN118 INF110 INF102 INF103 INF212 IN211 IN210 IN394 INF310 INF111 IN395 MA100 INF212 INF110 IN211 INF101 INF102 INF310 MA008 INF103 MA-IN 118 IN210

Topologisk sortering / løkkesøk proc TopSort(D, Sortering[0, n -1]) merke[0, n -1] = 0 // Tabell med nodenes merker (-1,0,1) teller = n -1 for v = 0 to n -1 do if merke[v] = 0 then DFSOutTopLabel(D,v) endfor proc DFSOutTopLabel(D,v) recursive merke = 1 for < hver nabo w av v > do if merke[w] = 0 then DFSOutTopLabel(D,w) // w uutforsket, fortsett elseif merke[w] = 1 then Output(”Løkke funnet”) // utforsker w, løkke merke[v] = -1 // v ferdig utforsket Sortering[teller] = v teller = teller - 1 end proc O(n+m)

Topologisk sortering / løkkesøk Eksempel 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Eksempel 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 2 1 7 8 7 3 6 8 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 2 1 7 8 7 3 6 8 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 2 1 7 8 7 3 6 8 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 2 1 7 8 7 3 6 8 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 2 1 7 8 7 4 3 6 8 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 3 2 1 7 8 7 4 3 6 8 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 3 2 1 7 8 7 4 3 6 8 2 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 3 2 1 7 8 7 4 3 6 8 2 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk 6 Eksempel 5 3 2 1 7 8 7 1 4 3 6 8 2 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Eksempel 2 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Eksempel 2 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Eksempel 2 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Eksempel 2 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Eksempel 2 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Topologisk sortering / løkkesøk Node 0 er ”under utforskning”, merke[0] = 1. - LØKKE ! Eksempel 2 2 1 7 8 3 6 4 5 v 1 2 3 4 5 6 7 8 Sortering

Sterkt sammenhengende komponenter 2 3 1 6 4 7 8 5 Måtte gjøre flere DFS-søk Fikk skog av DFS-trær a b g d c f h e j i

Sterkt sammenhengende komponenter 2 3 1 6 4 7 8 5 Måtte gjøre flere DFS-søk Fikk skog av DFS-trær start a b g b h g c f j d c f h a i d e j i e (rettet) graf DFS-traversering

Sterkt sammenhengende komponenter 2 3 1 6 4 7 8 5 Måtte gjøre flere DFS-søk Fikk skog av DFS-trær a b g b h g c f j d c f h a i d e j i e (rettet) graf DFS-traversering Klarer ikke traversere hele grafen i en jafs.

Sterkt sammenhengende komponenter En rettet graf er sterkt sammenhengende dersom det går en (rettet) sti fra enhver node til enhver annen node. (Både u→v og v→u.) En rettet graf er svakt sammenhengende dersom den underliggende grafen er sammenhengende. DFS kan brukes til å finne ut om en rettet graf er sterkt sammenhengende. Evt. til å finne de sterkt sammenhengende komponentene i grafen. a b b d d c c Sterkt sammenhengende Svakt sammenhengende (Alternativ formulering: For ethvert par av noder, finnes en rettet sykel som inneholder nodene.)

Sterkt sammenhengende komponenter Bruker vi definisjonen av strekt sammenhengende komponenter, ser vi at vi har følgende strekt sammenhengende komponenter i grafen (se etter syklene). a b g d c f h e j i

Sterkt sammenhengende komponenter 2 5 10 a b g b h g c f j d c f h 1 3 4 9 a i d e j i 8 7 e graf D DFS-traversering av D

Sterkt sammenhengende komponenter 2 5 10 a b g b h g c f j d c f h 1 3 4 9 a i d e j i 8 7 e graf D DFS-traversering av D 2 5 10 a b g g h b d e i a d c f h 1 3 4 9 j c e j i f 8 7 snudd graf Dr DFS-traversering av Dr , noder med høyest postnummer tatt først.

Sterkt sammenhengende komponenter 2 5 10 a b g b h g c f j d c f h 1 3 4 9 a i d e j i 8 7 e graf D DFS-traversering av D 2 5 10 a b g g h b d e i a d c f h 1 3 4 9 j c e j i f 8 7 snudd graf Dr DFS-traversering av Dr , noder med høyest postnummer tatt først.

Sterkt sammenhengende komponenter 2 5 10 a b g b h g c f j d c f h 1 3 4 9 a i d e j i 8 7 e graf D En DFS-traversering av D tar med for mye. 2 5 10 a b g g h b d e i a d c f h 1 3 4 9 j c e j i f 8 7 snudd graf Dr En DFS-traversering av Dr i tillegg (rekkefølgen er viktig) kniper av det som for mye.

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 9 En node v i en graf G er et artikulasjonspunkt dersom grafen G – v (grafen som fremkommer ved å slette v fra V(G) og alle kanter som har v som et av sine endepunkter fra E(G)) er usammenhengende. (Vi antar at G er sammenhengende til å begynne med) En 2-sammenhengende komponent av en graf G er en maksimal subgraf B som ikke inneholder noen artikulasjonspunkter.

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 9 En node v i en graf G er et artikulasjonspunkt dersom grafen G – v (grafen som fremkommer ved å slette v fra V(G) og alle kanter som har v som et av sine endepunkter fra E(G)) er usammenhengende. (Vi antar at G er sammenhengende til å begynne med) En 2-sammenhengende komponent av en graf G er en maksimal subgraf B som ikke inneholder noen artikulasjonspunkter.

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 9 En node v i en graf G er et artikulasjonspunkt dersom grafen G – v (grafen som fremkommer ved å slette v fra V(G) og alle kanter som har v som et av sine endepunkter fra E(G)) er usammenhengende. (Vi antar at G er sammenhengende til å begynne med) En 2-sammenhengende komponent av en graf G er en maksimal subgraf B som ikke inneholder noen artikulasjonspunkter.

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 9 En node v i en graf G er et artikulasjonspunkt dersom grafen G – v (grafen som fremkommer ved å slette v fra V(G) og alle kanter som har v som et av sine endepunkter fra E(G)) er usammenhengende. (Vi antar at G er sammenhengende til å begynne med) En 2-sammenhengende komponent av en graf G er en maksimal subgraf B som ikke inneholder noen artikulasjonspunkter.

2-sammenhengende komponenter Artikulasjonspunkter 3 4 10 1 8 5 6 7 2 9 3 4 10 1 1 8 5 2 6 7 2 2-sammenhengende komponenter 9

2-sammenhengende komponenter Artikulasjonspunkter

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 9 1 2 6 3 4 9 7 10 8 5

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 9 1 5 9 DFSNum (preorder) 1 2 6 2 6 8 10 3 4 9 7 3 7 10 8 4 5

2-sammenhengende komponenter 3 4 10 1 8 5 6 7 2 0 0 9 1 1 5 0 9 0 DFSNum - preorder nummerering Lowest - laveste DFSNum vi kan komme til ved å følge tre-kanter og en tilbake-kant. 1 2 6 2 1 6 0 8 8 10 0 3 4 9 7 3 1 7 5 10 8 4 1 5

2-sammenhengende komponenter 0 0 1 1 5 0 9 0 DFSNum - preorder nummerering Lowest - laveste DFSNum vi kan komme til ved å følge tre-kanter og en tilbake-kant. 1 2 6 2 1 6 0 8 8 10 0 3 4 9 7 3 1 7 5 10 8 4 1 5 En node v i et DFS-tre, v forskjellig fra roten i treet, er et artikulasjonspunkt i den underliggende grafen hvis og bare hvis v har minst et barn c med Lowest[c] ≥ DFSNum(v) . (Dette uttrykker at vi ikke ”kommer oss opp igjen” i treet.) Roten i DFS-treet er et spesialtilfelle. Denne er et artikulasjonspunkt hvis og bare hvis den har to eller flere barn.

2-sammenhengende komponenter 0 0 1 1 5 0 9 0 DFSNum - preorder nummerering Lowest - laveste DFSNum vi kan komme til ved å følge tre-kanter og en tilbake-kant. 1 2 6 2 1 6 0 8 8 10 0 3 4 9 7 3 1 7 5 10 8 4 1 5 En node v i et DFS-tre, v forskjellig fra roten i treet, er et artikulasjonspunkt i den underliggende grafen hvis og bare hvis v har minst et barn c med Lowest[c] ≥ DFSNum(v) . (Dette uttrykker at vi ikke ”kommer oss opp igjen” i treet.) Roten i DFS-treet er et spesialtilfelle. Denne er et artikulasjonspunkt hvis og bare hvis den har to eller flere barn.

2-sammenhengende komponenter DFSNum - preorder nummerering Nummeret settes fortløpende med en gang vi kommer til en node. Lowest - laveste DFSNum vi kan komme til ved å følge tre-kanter og en tilbakekant.

2-sammenhengende komponenter proc DFSNumberings(G, v) recursive i = i +1 // Global teller, initielt -1, s.a. vi får 0 første gang mark[v] = 1 // Global array over nodenes merker, initielt 0 DFSNum[v] = i // Global array med DFSNum (preorder nummerering) for < hver nabo u av v > do if mark[u] = 0 then // u uutforsket, fortsett treeDFS[u] = v // Gobalt forelder-array, v er u sin forelder i DFS-treet. DFSNumberings(G,u) // Fortsett dybde først endif endfor min1 = {lowest[c] < for hvert barn c av v >} min2 = min {DFSNum[w] < vw en tilbakekant (w ikke forelder av v, sjekk treeDFS) >} lowest[v] = min {DFSNum[v], Min1, Min2} // Globalt array med Lowest. end proc

2-sammenhengende komponenter proc ArticulationPoints(G) for v = 0 to n -1 do // Initier arrayer, tellere, liste over artikulasjonspunkter mark[v] = treeDFS = 0 endfor i = -1 art =  DFSNumberings(G, 0) // Nummerer nodene, 0 blir rotnoden number = 0 // Sjekker om rotnoden har flere enn to barn c = 1 while number < 2 and c < n do if treeDFS[c] = 0 then number = number + 1 c = c + 1 endwhile if number = 2 then art = art  {0} for c =1 to n -1 do // Sjekker om de andre nodene er artikulasjonspkter v = treeDFS[c] // finn forelder, v er c sin forelder i DFS-treet if lowest[c] ≥ DFSNum[v] and v > 0 then art = art  {v} return(art) end proc

2-sammenhengende komponenter Ønsker vi å finne de 2-sammenhengende komponentene, holder der ikke bare å finne artikulasjonspunktene. Noder kan tilhøre flere 2-sammenhengende komponenter. Kanter kan derimot ikke tilhøre mer enn en 2-sammenhengende komponent. For å finne de 2-sammenhengende komponenter bruker vi en ekstra stack til kantene, på følgende måte. Initielt er kant-stacken tom. Hver kan vi følger en kant uv i grafen i dybde først-søket pusher vi uv. (Alle kanter i grafen pushes (selv om noden v er utforsket). Det er altså ikke bare tre-kanter som havner på denne kant-stacken. Når dybde først-søket backtracker langs en kant uv, fra v til u, og lowest[v] ≥ DFSNum[u], så popper vi alt som ligger på kant-stacken fram til og med kanten uv. Kantene som poppes i en slik bolk induserer en 2-sammenhengende komponent.