Korteste vei i en vektet graf uten negative kanter



Like dokumenter
GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

INF Algoritmer og datastrukturer

INF1020 Algoritmer og datastrukturer GRAFER

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

GRAFER. Noen grafdefinisjoner. Korteste vei i en uvektet graf V 2 V 1 V 5 V 3 V 4 V 6

INF Algoritmer og datastrukturer

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Det første grafteoretiske problem: Broene i Königsberg

Anvendelser av grafer

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Løsningsforslag - Korteste vei

INF Algoritmer og datastrukturer

Uretta grafar (1) Mengde nodar Mengde kantar som er eit uordna par av nodar

Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

PG4200 Algoritmer og datastrukturer Forelesning 10

INF Algoritmer og datastrukturer

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Minimum Spenntrær - Kruskal & Prim

Rettede, ikke-sykliske grafer (DAG)

Korteste Vei II. Lars Vidar Magnusson Kapittel 24 Bellman-Ford algoritmen Dijkstra algoritmen

INF Algoritmer og datastrukturer

København 20 Stockholm

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

INF Algoritmer og datastrukturer

ITF20006 Algoritmer og datastrukturer Oppgavesett 7

Algoritmer og Datastrukturer

Løsningsforslag for utvalgte oppgaver fra kapittel 9

LØSNINGSFORSLAG SIF5015 DISKRET MATEMATIKK Onsdag 18. desember 2002

UNIVERSITETET I OSLO

Vann i rør Ford Fulkerson method

INF Algoritmer og datastrukturer

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

Grunnleggende Grafteori

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Notater til INF2220 Eksamen

Minimum spenntrær. Lars Vidar Magnusson Kapittel 23. Kruskal Prim

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

GRAFER. Hva er en graf? Det første grafteoretiske problem: Broene i Königsberg. Grafer vi har sett allerede

Studentnummer: Side 1 av 1. Løsningsforslag, Eksamen i TDT4120 Algoritmer og datastrukturer August 2005

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

Eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Pensum: fra boken (H-03)+ forelesninger

Et eksempel: Åtterspillet

Vi skal se på grafalgoritmer for:

Øvingsforelesning 7. Dijkstras algoritme. Foiler: Fredrik Ludvigsen Foreleser: Jon Marius Venstad 10/4/09 1

O, what a tangled. Fjerde forelesning. Robot-eksemplet som ikke ble gjennomgått sist blir frivillig selvstudium (ut fra foilene :-)

Disjunkte mengder ADT

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Uke 5 Disjunkte mengder

MAT1140: Kort sammendrag av grafteorien

PG4200 Algoritmer og datastrukturer forelesning 10. Lars Sydnes 21. november 2014

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Korteste vei problemet (seksjon 15.3)

Go with the. Niende forelesning. Mye matematikk i boka her ikke så komplisert, men mye å holde styr på.

Pensum: fra boken (H-03)+ forelesninger

Vi skal se på grafalgoritmer for:

Matchinger i ikke-bipartite grafer

Korteste Vei I. Lars Vidar Magnusson Kapittel 24 Hvordan finne korteste vei Egenskaper ved korteste vei

Hva er en algoritme? Har allerede sett på mange algoritmer til nå i IT1101. Forholdet mellom en algoritme og et program. Algoritme program prosess

MAT1030 Diskret Matematikk

EKSAMEN med løsningsforslag

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Oppgave 1. Sekvenser (20%)

Løsnings forslag i java In115, Våren 1998

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Definisjon av binært søketre

INF2220: Time 4 - Heap, Huffmann

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 18. Desember 2000, kl

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

Kontinuasjonseksamen i fag SIF8010 Algoritmer og Datastrukturer Torsdag 9. August 2001, kl

Eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

IN Algoritmer og datastrukturer

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Del 1(8%) 5 h. Del 2(42%)

Introduksjon. MAT1030 Diskret Matematikk. Introduksjon. En graf. Forelesning 22: Grafteori. Roger Antonsen

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

Introduksjon. MAT1030 Diskret matematikk. Søkealgoritmer for grafer. En graf

MAT1030 Diskret matematikk

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

LO118D Forelesning 10 (DM)

Transkript:

Dagens plan: IN - Algoritmer og datastrukturer HØSTEN 7 Institutt for informatikk, Universitetet i Oslo IN, forelesning 7: Grafer II Korteste vei, en-til-alle, for: Vektet rettet graf uten negative kanter (kap. 9.3.) () Vektet rettet graf med negative kanter (kap. 9.3.3) Prim (kap. 9.5.) Kruskal (kap. 9.5.) Dybde først søk (kap. 9.6.) inne sammenhengskomponenter Løkkeleting Dobbeltsammenhengende grafer (kap. 9.6.) Å nne ledd-noder (articulation points) Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4 Korteste vei i en vektet graf uten negative kanter Graf uten vekter: Velger først alle nodene med avstand fra startnoden, så alle med avstand osv Mer generelt: Velger hele tiden en ukjent node blant dem med minst avstand fra startnoden Den samme hovedidéen kan brukes hvis vi har en graf med vekter Akkurat som for uvektede grafer, ser vi bare etter potensielle forbedringer for naboer som ennå ikke er valgt (kjent) Denne algoritmen ble publisert av Dijkstra i 959 og har fått navn etter ham. or alle noder: Sett avstanden fra startnoden s lik. Merk noden som ukjent. Sett avstanden fra s til seg selv lik 3. Velg en ukjent node v med minimal avstand fra s (det kan være ere med samme avstand), og marker v som kjent 4. or hver ukjent nabonode w til v: Dersom avstanden vi får ved å følge veien gjennom v, er kortere enn den gamle avstanden til s reduserer avstanden til s for w sett bakoverpekeren i w til v 5. Så lenge det nnes ukjente noder, gå til punkt 3 Merk: virker både på rettede og urettede grafer Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 3 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 4 / 4

Hvorfor virker algoritmen? Algoritmen har følgende invariant: Ingen kjent node har større avstand til s enn en ukjent node ølgelig har alle kjente noder riktig korteste vei satt (registrert avstand er lavest mulig kost av en vei til s) Vi plukker ut en ukjent node v med minst avstand (d v ), markerer den som kjent og påstår at avstanden til v er riktig Denne påstanden holder fordi d v er den korteste veien som nnes ved å bruke bare kjente noder de kjente nodene har riktig korteste vei satt en vei til v som er kortere enn d v, må nødvendigvis forlate mengden av kjente noder et sted, men d v er allerede den korteste veien fra kjente noder til v Dette argumentet holder fordi vi ikke har negative kanter Eksempel Den første noden som velges, er startnoden V Naboene til V har fått endret sin avstand og fått tilbakepekere til V Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 5 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 6 / 4 Nå er V nærmeste ukjente node V 4 har fått ny avstand og tilbakepeker, mens V 3 er nærmeste ukjente node V 6 har fått endret sin avstand og fått tilbakepeker til V 3 Nå er V 4 nærmeste ukjente node Merk at den aldri senere kan få endret sin avstand Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 7 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 8 / 4

Vi velger V 6 som blir kjent V 7 har fått ny avstand og tilbakepeker, og V 6 og V 7 er nærmeste ukjente noder Nå er V 7 nærmest og blir kjent Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 9 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4 Oppgave Bruk, og fyll ut tabellen nedenfor! 4 V 3 V V 3 5 8 V 4 4 6 V 5 V 6 V 7 Initielt: v kjent avstand vei v kjent avstand vei V 5 får ny avstand og tilbakepeker Vi kan nå avslutte med å gjøre V 5 kjent v v v 3 v 4 v 5 v 6 v 7 8 8 8 8 8 8 v v v 3 v 4 v 5 v 6 v 7 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4

Tidsforbruk Hvis vi leter sekvensielt etter den ukjente noden med minst avstand tar dette O( V ) tid, noe som gjøres V ganger, så total tid for å nne minste avstand blir O( V ) I tillegg oppdateres avstandene, maksimalt en oppdatering per kant, dvs. til sammen O( E ) Total tid: O( E + V ) = O( V ) Bra for tette grafer: E = V ) Raskere implementasjon (for tynne grafer): Bruker en prioritetskø til å ta vare på ukjente noder med avstand mindre enn Prioriteten til ukjent node forandres hvis vi nner kortere vei til noden DeleteMin og DecreaseKey tar O(log V ) tid Totalt tidsforbruk blir O( V log V + E log V ) = O( E log V ) Hva med negative kanter? fungerer ikke med negative kanter (oppg. 9.7a) En mulig løsning: Nodene er ikke lenger kjente eller ukjente Vi har i stedet en kø som inneholder noder som har fått forbedret avstandsverdien sin Løkken i algoritmen gjør følgende:. Ta ut en node v fra køen. or hver etterfølger w, sjekk om vi får en forbedring 3. Oppdater i så fall avstanden, og plasser w (tilbake) i køen (hvis den ikke er der allerede) Tidsforbruket blir O( E V ), dvs. mye verre enn Det nnes ingen korteste vei med negative løkker i G. Det er det hvis og bare hvis samme node blir tatt ut av køen mer enn V ganger. Da må vi terminere algoritmen! Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 3 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 4 / 4 Grådige algoritmer Et minimalt spenntre for en urettet graf G er et tre bestående av kanter fra grafen, slik at alle nodene i G er forbundet til lavest mulig kostnad eksisterer bare for sammenhengende grafer Generelt kan det nnes ere minimale spenntrær for samme graf Grådige algoritmer Prøver i hvert trinn å gjøre det som ser best ut der og da Typisk eksempel: Gi vekslepenger Raske algoritmer, men kan ikke løse alle problemer: V V V V 4 3 7 V 3 V 4 V 5 V 3 V 4 5 8 4 6 4 6 V 6 V 7 V 6 V 7 Hvor mange kanter får spenntreet i det generelle tilfellet? V 5 inn det høyeste punktet! Vi skal se på to ulike grådige algoritmer for å nne minimale spenntrær Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 5 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 6 / 4

Treet bygges opp trinnvis I hvert trinn legges en kant (og dermed en tilhørende node) til treet Vi har til enhver tid to typer noder: Noder som er med i treet Noder som ikke er med i treet Nye noder legges til ved å velge en kant (u, v) med minst vekt slik at u er med i treet, og v ikke er det. Algoritmen begynner med å velge en vilkårlig node Eksempel: La oss velge v Minste kant ut fra v går til v 4, så vi legger den inn i spenntreet Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 7 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 8 / 4 Vi har nå to mulige fortsettelser: Kanten fra v til v Kanten fra v 4 til v 3 Samme hvilken vi velger, vil den andre av dem bli neste kant, så vi legger dem begge inn i spenntreet Minste kant ut fra spenntreet går nå fra v 4 til v 7 Så får vi kanten fra v 7 til v 6 Til slutt får vi kanten fra v 7 til v 5 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 9 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4

er essensielt lik for korteste vei! I er avstanden til en ukjent node v den minste vekten til en kant som forbinder v med en kjent node Husk at vi har urettede grafer, så hver kant benner seg i to nabolister Kjøretidsanalysen er den samme som for V 3 4 5 V 3 V 4 8 V 7 4 6 V 6 V 7 V 5 v v v v 3 v 4 v 5 v 6 v 7 kjent avstand 8 8 8 8 8 8 vei Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 / 4 Hvorfor virker Prim? Løkke-lemma for spenntrær Anta at U er et spenntre for en graf, og at kanten e ikke er med i treet U Hvis vi legger kanten e til treet U, dannes en entydig bestemt enkel løkke Hvis, og bare hvis, vi fjerner en vilkårlig kant i denne løkken, vil vi igjen ha et spenntre for grafen Invariant for Det treet T som dannes av de kantene (og deres endenoder) vi til nå har plukket ut, er slik at det nnes et minimalt spenntre U for grafen som inneholder (alle kantene i) T Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 3 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 4 / 4

Kruskals algoritme Kruskals algoritme Kruskals algoritme: Se på kantene en etter en, sortert etter minst vekt Kanten aksepteres hvis, og bare hvis, den ikke fører til noen løkke Algoritmen implementeres vha. en prioritetskø og disjunkte mengder: Initielt plasseres kantene i en prioritetskø og nodene i hver sin disjunkte mengde Invariant: De disjunkte mengdene er subtrær av det endelige spenntreet deletemin gir neste kant (u, v) som skal testes Hvis nd(u)! = nd(v), har vi en ny kant i treet og gjør union(u, v) Hvis ikke, ville (u, v) ha dannet en løkke, så kanten forkastes Algoritmen terminerer når prioritetskøen er tom, eventuelt når vi har lagt inn V kanter Eksempel Utgangspunkt for Kruskals algoritme: Vi har to kanter med vekt De blir til to subtrær i spenn-treet Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 5 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 6 / 4 Kruskals algoritme Kruskals algoritme Vi har to kanter med vekt De blir del av det øverste subtreet Vi har en kant med vekt 5 som lager løkke Vi har en kant med vekt 6: Den knytter den siste noden til treet Vi har en kant med vekt 3 Den vil lage en løkke og må forkastes Vi har to kanter med vekt 4 hvor den mellom v og v 3 danner en løkke, mens den andre binder de to subtrærne sammen Nå har vi lagt inn V kanter i spenn-treet og kan slutte Hvis vi fortsetter med resten av kantene, vil alle danne løkker og bli forkastet Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 7 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 8 / 4

Kruskals algoritme Dybde-først søk Tidsanalyse: Hovedløkken går E ganger I hver iterasjon gjøres en deletemin, to nd og en union, med samlet tidsforbruk O(log E ) + O(log V )+O() = O(log V ) (fordi log E < log V ) Totalt tidsforbruk er O( E log V ) Prim vs. Kruskal er noe mer eektiv enn Kruskals, spesielt for tette grafer virker bare i sammenhengende grafer Kruskas algoritme gir et minimalt spenn-tre i hver sammenhengskomponent i grafen Dybde-først søk Generalisering av preks traversering for trær. Vi starter i en node v og traverserer alle nabonodene rekursivt Rekursjonen gjør at vi undersøker alle noder som kan nåes fra første etterfølger til v, før vi undersøker neste etterfølger til v or en vilkårlig graf må vi passe på å unngå løkker: Markerer nodene som besøkt etterhvert som de behandles, og kaller rekursivt videre bare for umerkede noder v o i d d y b d e ø r s t S ø k ( Node v ) { v. merke = t r u e ; f o r < h v e r nabo w t i l v > { i f (! w. merke ) { d y b d e ø r s t S ø k (w ) ; Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 9 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 3 / 4 Dybde-først søk Midtveis i en dybde-først traversering kan kjeden av rekursive metodekall og besøkt-merkene i nodene se slik ut: a* c b* g d* f * e * void DS(f) { DS (g) void DS(d) { DS (f) void DS(b) { DS (d) void DS(a) { DS (b) DS (a) Her er vi nå! Noder merket * er besøkte Node e er allerede behandlet ferdig Nå behandles node f Den kommer til å kalle DS(g) DS(g) har ingen ikke besøkte etterfølgere Dermed må algoritmen «trekke seg tilbake» ørst i DS(b) finnes det en ikke besøkt etterfølger Dybde-først søk Er grafen sammenhengende? Hvis grafen ikke er sammenhengende, kan vi foreta nye dybde-først søk fra noder som ikke er besøkte, inntil alle nodene er behandlet En urettet graf er sammenhengende hvis og bare hvis et dybde-først søk som starter i en tilfeldig node, besøker alle nodene i grafen En rettet graf er sterkt sammenhengende hvis og bare hvis vi fra hver eneste node v klarer å besøke alle de andre nodene i grafen ved et dybde-først søk fra v Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 3 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 3 / 4

Dybde-først søk Løkkeleting Dybde-først søk Løkkeleting Løkkeleting Vi kan bruke dybde-først søk til å sjekke om en graf har løkker Bruker tre verdier til tilstandsvariablen: usett, igang og ferdig (besøkt) v o i d l ø k k e L e t ( Node v ) { i f ( v. t i l s t a n d == i g a n g ) { < Løkke e r f u n n e t > e l s e i f ( v. t i l s t a n d == u s e t t ) { v. t i l s t a n d = i g a n g ; f o r < h v e r nabo w t i l v > { l ø k k e L e t (w ) ; v. t i l s t a n d = f e r d i g ; Metoden for løkkeleting kan også gi oss en topologisk sortering (med nodene skrevet ut i omvendt rekkefølge) dersom grafen ikke har løkker Det får vi til ved å skrive ut noden like før vi trekker oss tilbake (idet vi er ferdig med kallet) Dette er riktig tidspunkt å skrive ut noden fordi: Vi har sjekket alle etterfølgerne til noden Disse var enten usette (og da har vi skrevet dem ut i det vi trakk oss tilbake fra dem), eller ferdige (og da var de skrevet ut tidligere) Dersom vi fant en node som var igang, har vi funnet en løkke... Noder der kall er i gang ligger alltid på en rett vei fra startnoden Vi må passe på å gjøre nye startkall inntil metoden er kalt i alle nodene Metoden vil alltid nne en løkke dersom det eksisterer en! Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 33 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 34 / 4 Dobbeltsammenhengende grafer Dobbeltsammenheng (biconnectivity) a Dobbeltsammenhengende grafer b d e a c b d e En dybde-først traversering av grafen i leksikogrask ordning ser slik ut: c (igur 9.6, side 357 i MAW) En dobbeltsammenhengende graf er en graf som fortsatt er sammenhengende selv om en vilkårlig node blir fjernet fra grafen Viktig egenskap i mange nettverk (som strøm-, vei-, data- og internett) Vanlige rekursive kall (heltrukne linjer) som danner et spenntre for grafen Stiplede linjer viser bakoverkall, dvs. forsøk på kall av merkede noder Disse kalles bakoverkanter i grafen Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 35 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 36 / 4

Dobbeltsammenhengende grafer Dobbeltsammenhengende grafer Algoritme Sammenhengende grafer som ikke er dobbeltsammenhengende, må ha minst en ledd-node (articulation point), dvs. en node vi ikke kan fjerne uten å gjøre grafen ikke-sammenhengende Eksempel (g. 9.6 i MAW): Her har vi to ledd-noder: C og D Vi ser at ved å fjerne C mister G sin forbindelse til grafen, og ved å fjerne D, får vi to sammenhengskomponenter, {A, B, C, G og {E, Algoritme for å nne ledd-noder orutsetning: Vi har en sammenhengende graf G Gjør et dybde-først søk i G og gi hver node v et besøksnummer Nr(v) (prex-ordning) Vi har nå et spenntre T for G (med bakoverkanter) hvor Nr(v) øker når vi går nedover i T or hver node v i T denerer vi Lav(v) som den lavest nummererte node som kan nåes fra v ved å gå null eller ere kanter utover i T og til slutt muligens tilbake langs én bakoverkant Mer presist er Lav(v) denert som minimum av Nr(v) Minste Nr(w) der (v, w) er bakoverkant i G (dvs. en kant i G \ T ) Minste Lav(w) der (v, w) er kant i T Merk at idet vi er ferdig med v, kjenner vi Lav(v) slik at vi får merket nodene med Lav(v) i postx-orden Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 37 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 38 / 4 Dobbeltsammenhengende grafer Algoritme Dobbeltsammenhengende grafer Eksempel Eksempel ra verdiene av Nr(v) og Lav(v) kan vi nå avgjøre hvilke av i nodene i T som er ledd-noder Vi har to tilfeller:. Rotnoden er en ledd-node hvis, og bare hvis, den har mer enn ett barn. Øvrige noder v er ledd-noder hvis, og bare hvis, v har et barn w med Lav(w) Nr(v) Rotnoden tilfredsstiller alltid det andre kriteriet, så den må behandles spesielt Merk at vi bare trenger én traversering for å utføre hele algoritmen, så tidsordenen blir O( V + E ) Vi utfører algoritmen og merker hver node v med Nr(v)/Lav(v) Det følgende eksemplet viser hvordan og hvorfor algoritmen virker Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 39 / 4 Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 4 / 4

Dobbeltsammenhengende grafer Eksempel Vi ser på de to tilfellene:. Hvis roten har ere barn, kan vi ikke fjerne roten uten å splitte grafen Det er ikke tilfelle her. Vi ser at node D har et barn E med Lav(E) Nr(D) Det betyr at vi ikke kan komme fra E til noen node v med lavere nummer enn D uten å gå gjennom D Altså er D en ledd-node Tilsvarende har node C et barn G med Lav(G) Nr(C) Altså er også C en ledd-node Se også gur 9.64 på side 36 i MAW Einar Broch Johnsen (I, UiO) IN H7, forelesning 7 4 / 4