Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan.

Samankaltaiset tiedostot
Algoritmi on periaatteellisella tasolla seuraava:

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

Pienin virittävä puu (minimum spanning tree)

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

Johdatus graafiteoriaan

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

j(j 1) = n(n2 1) 3 + (k + 1)k = (k + 1)(k2 k + 3k) 3 = (k + 1)(k2 + 2k + 1 1)

Tarkennamme geneeristä painamiskorotusalgoritmia

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Näytetään nyt relaatioon liittyvien ekvivalenssiluokkien olevan verkon G lohkojen särmäjoukkoja. Olkoon siis f verkon G jokin särmä.

Johdatus graafiteoriaan

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

b) Olkoon G vähintään kaksi solmua sisältävä puu. Sallitaan verkon G olevan

Algoritmit 1. Luento 8 Ke Timo Männikkö

isomeerejä yhteensä yhdeksän kappaletta.

Tehtävä 8 : 1. Tehtävä 8 : 2

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

Algoritmit 1. Luento 9 Ti Timo Männikkö

Puiden karakterisointi

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa1 : Leveys- ja syvyyshaku

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 13 Ma Timo Männikkö

13 Lyhimmät painotetut polut

Induktiotodistus: Tapaus n = 0 selvä; ol. väite pätee kun n < m.

Alaraja vertailuihin perustuvalle järjestämiselle

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

A TIETORAKENTEET JA ALGORITMIT

Äärellisten mallien teoria

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Tehtävä 4 : 2. b a+1 (mod 3)

Tietorakenteet ja algoritmit. Verkot. Ari Korhonen

Miten käydä läpi puun alkiot (traversal)?

Kysymys: Voidaanko graafi piirtää tasoon niin, että sen viivat eivät risteä muualla kuin pisteiden kohdalla?

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

6. Approksimointialgoritmit

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Datatähti 2019 loppu

Lyhin kahden solmun välinen polku

Suunnatun verkon syklittömyyden testaaminen

Yhtenäisyydestä. Johdanto. Lähipisteavaruus. Tuomas Korppi

Tietorakenteet, esimerkkivastauksia viikon 12 laskareihin

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

Algoritmit 2. Luento 6 To Timo Männikkö

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

Luku 8. Aluekyselyt. 8.1 Summataulukko

Näin ollen saadaan tulos rad(g) diam(g). Toisaalta huomataan, että verkon G kaikilla solmuilla x ja y pätee kolmioepäyhtälön nojalla havainto

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

Polkuintegraali yleistyy helposti paloitain C 1 -poluille. Määritelmä Olkoot γ : [a, b] R m paloittain C 1 -polku välin [a, b] jaon

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

4. Joukkojen käsittely

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 2. Luento 6 Ke Timo Männikkö

Ei-yhteydettömät kielet [Sipser luku 2.3]

Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa.

Miten osoitetaan joukot samoiksi?

Algoritmit 1. Luento 7 Ti Timo Männikkö

Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }?

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 11 Ti Timo Männikkö

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Ratkaisu: a) Kahden joukon yhdisteseen poimitaan kaikki alkiot jotka ovat jommassakummassa joukossa (eikä mitään muuta).

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 14 Ke Timo Männikkö

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

Diskreetin matematiikan perusteet Esimerkkiratkaisut 3 / vko 10

v 8 v 9 v 5 C v 3 v 4

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

Tehtävä 10 : 1. Tehtävä 10 : 2

Eulerin verkkojen karakterisointi

Algoritmit 1. Luento 10 Ke Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

Liite: Verkot. TKK (c) Ilkka Mellin (2004) 1

4.3. Matemaattinen induktio

Epädeterministisen Turingin koneen N laskentaa syötteellä x on usein hyödyllistä ajatella laskentapuuna

Algoritmit 2. Luento 14 Ke Timo Männikkö

Ratkaisu. Tulkitaan de Bruijnin jonon etsimiseksi aakkostossa S := {0, 1} sanapituudelle n = 4. Neljän pituisia sanoja on N = 2 n = 16 kpl.

A TIETORAKENTEET JA ALGORITMIT

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin

Tietorakenteet ja algoritmit - syksy

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Transkriptio:

5. Verkkoalgoritmeja Eräs keskeinen algoritmien suunnittelutekniikka on Palauta ongelma johonkin tunnettuun verkko-ongelmaan. Palauttaminen edellyttää usein ongelman ja algoritmin pientä modifioimista, joten on tärkeä ymmärtää hyvin perusalgoritmien keskeiset toimintaperiaatteet. Tämän luvun jälkeen opiskelija tuntee yksityiskohtaisesti syvyyssuuntaisen haun (DFS) ja sen analyysin suunnatussa ja suuntaamattomassa verkossa osaa soveltaa DFS:ää osana muiden verkko-ongelmien ratkaisua tuntee maksimivuo-ongelman peruspiirteet ja osaa palauttaa muita ongelmia maksimivuo-ongelmaan osaa ratkaista maksimivuo-ongelman Edmondsin-Karpin algoritmilla tuntee kehittyneempien maksimivuoalgoritmien yleisperiaateet Ei pidä unohtaa aiemminkaan opittuja algoritmeja (osa kurssilla Tietorakenteet): leveyssuuntainen haku, Dijkstra, Floyd-Warshall, Kruskal, Prim. 251

5.1 Syvyyssuuntainen haku Perusalgoritmi on tuttu kurssilta Tietorakenteet. Oletetaan, että verkko G = (V, E) on annettu vieruslistoina L[v], v V. Tuloksena saadaan verkon syvyyssuuntainen virittävä metsä T E ja solmujen esi- ja jälkinumerot prenum[v] ja postnum[v], v V. DFS: T := ; pre := 1; post := 1 for v V do new[v] := True for v V do if new[v] then DFS-Visit(v) DFS-Visit(v): prenum[v] := pre; pre := pre + 1; new[v] := False for w L[v] do if new[w] then T := T { (v, w) } DFS-Visit(w) postnum[v] := post; post := post + 1; Sama algoritmi toimii suunnatuille ja suuntaamattomille verkoille. (Jälkimmäisessä tapauksessa vain aina w L[v] v L[w].) Lopputuloksen tulkinta kuitenkin on hieman erilainen. Tarkastellaan ensin suunnattuja verkkoja. 252

Lause Verkon G = (V, E) syvyyssuuntainen haun aikavaativuus on O( V + E ). Todistus Muut osat kuin DFS-Visit-kutsut vievät selvästi ajan O( V ). Kullakin v V kutsu DFS-Visit(v) suoritetaan tasan kerran, sillä kutsu merkitsee solmun v heti vanhaksi eikä siihen enää mennä. Kutsun DFS-Visit(v) aikavaativuus lukuunottamatta rekursiivisia DFS-Visit-kutsuja on selvästi O(1 + L[v] ). Siis kaikkiaan DFS-Visit-kutsut vievät ajan O( v V (1 + L[v] )) = O( V + E ). 253

Syvyyssuuntainen haku jakaa kaaret puukaariin T ja poikittaiskaariin E T. Tämä jako, ja solmujen numeroinnit, eivät ole yksikäsitteisiä, vaan riippuvat vieruslistojen järjestyksestä ja solmujen valintajärjestyksestä proseduurin DFS for-silmukassa. Suunnatussa verkossa poikittaiskaaret jaetaan edelleen: etenevät kaaret: solmusta sen aitoihin jälkeläisiin takautuvat kaaret: solmusta sen esivanhempiin (mukaanlukien solmusta itseensä) sivuttaiskaaret: kaikki muut 2 3 4 puu 1 5 9 etenevä 6 7 8 11 takautuva 10 sivuttais Eräs mahdollinen esinumerointi ja kaarten jaottelu verkossa 254

Lemma Jos (v, w) on sivuttaiskaari, niin prenum[v] > prenum[w] ja postnum[v] > postnum[w]. Todistus Oletetaan (v, w) E. Jos v = w, niin (v, w) on määritelmän mukaan takautuva. Oletetaan v w. Jos prenum[v] < prenum[w], niin kutsun DFS-Visit(v) tapahtuessa w on uusi. Siis w tulee solmun v jälkeläiseksi. Olkoon toisaalta prenum[v] > prenum[w] mutta postnum[v] < postnum[w]. Siis kutsun DFS-Visit(v) päättyessä kutsu DFS-Visit(w) on vielä kesken, joten v on solmun w jälkeläinen. 255

Topologinen järjestäminen Annettu: suunnattu syklitön verkko (Directed Acyclic Graph, DAG) G = (V, E). Määrättävä: kullekin solmulle v V järjestysnumero s[v] siten, että s[v] < s[w] jos (v, w) E Ratkaisu: s[v] = V postnum(v) Perustelu: Olkoon (v, w) E. Syklittömyyden takia takautuvia kaaria ei ole. Jos (v, w) on etenevä tai puukaari, algoritmista nähdään suoraan postnum[v] > postnum[w]. Jos (v, w) on sivuttaiskaari, niin postnum[v] > postnum[w] edellisen lemman perusteella. Muita helppoja DFS:n sovelluksia: saavutettavuuden testaaminen, syklittömyyden testaaminen 256

Vahvasti yhtenäiset komponentit Suunnatussa verkossa G merkitään u v jos solmusta u on polku solmuun v. Määritellään ekvivalenssirelaatio u v (u v ja v u). Ekvivalenssirelaation ekvivalenssiluokat ovat verkon vahvasti yhtenäiset komponentit. Algoritmi: verkon G vahvasti yhtenäiset komponentit 1. Laske verkon G solmujen jälkinumerot postnum[v]. 2. Muodosta G r, joka on muuten kuin G mutta kaarten suunnat on vaihdettu. 3. Suorita verkossa G r syvyyssuuntainen haku siten, että proseduurissa DFS solmut käsitellään jälkinumeroiden postnum mukaan laskevassa järjestyksessä. 4. Syntyvän virittävän metsän jokainen puu on samalla verkon G vahvasti yhtenäinen komponentti. 257

Lause Algoritmi laskee vahvasti yhtenäiset komponentit oikein ja ajassa O( V + E ). Todistus Aikavaativuus on selvä. Pitää osoittaa, että u ja v ovat samassa vahvasti yhtenäisessä komponentissa joss ne ovat samassa verkon G r syvyyssuuntaisessa virittävässä puussa. Jatkossa polut ja numeroinnit viittaavat alkuperäiseen verkkoon G ellei muuta mainita. : Jos verkossa G sekä u v että v u, niin sama pätee myös verkossa G r. Siis u ja v päätyvät samaan puuhun. : Olkoot u ja v samassa virittävässä puussa, jonka juuri on x. Siis u x ja v x. Riittää osoittaa, että myös x u ja x v. Osoitetaan x v; väite x u menee samaan tapaan. Jos v = x, asia on selvä. Muuten postnum[x] > postnum[v]. Toisaalta koska v x, kutsu DFS-Visit[x] alkaa ennen kuin DFS-Visit[v] päättyy. Siis v on solmun x jälkeläinen verkon G syvyyssuuntaisessa virittävässä metsässä, ja erityisesti x v. 258

Syvyyssuuntainen haku suuntaamattomassa verkossa Algoritmi ja sen aikavaativuus ovat samat kuin suunnatussa tapauksessa. Kaarten suuntaamattomuudesta seuraa, että sivuttaiskaaria ei synny. Haku siis jakaa kaaret kahteen luokkaan: puukaaret (joukko T ) muodostavat virittävän metsän takautuvat kaaret (joukko E T ) yhdistävät esivanhempia ja jälkeläisiä. 1 2 5 3 4 6 7 suuntaamaton verkko eräs esinumerointi, jako puukaariin (yhtenäinen) ja takautuviin (pisteet) 259

2-yhtenäiset komponentit ja artikulaatiopisteet: esimerkkisovellus syvyyssuuntaiselle haulle suuntaamattomassa verkossa Oletamme jatkossa, että käsiteltävä verkko on yhtenäinen. (Muuten käsitellään kukin yhtenäinen komponentti erikseen.) Yhtenäisen verkon solmu on artikulaatiopiste jos sen poistaminen (siihen liittyvine kaarineen) tekee verkosta epäyhtenäisen. Verkko on 2-yhtenäinen jos sillä ei ole artikulaatiopisteitä. Esim. tietoliikenneverkon tapauksessa 2-yhtenäisyys tarkoittaa, että yhden solmun poistuminen ei estä muiden solmujen välisiä yhteyksiä. Tämä yleistyy ilmeisellä tavalla k-yhtenäisyydeksi, k 2. Alustava intuitiivinen määrittely: verkon 2-yhtenäiset komponentit ovat sen maksimaaliset 2-yhtenäiset osaverkot. 260

a artikulaatipisteet b e c d f g Artikulaatiopisteet a a b e e c d f g 2-yhtenäiset komponentit (solmujoukot { a, b, c, d }, { a, e } ja { e, f, g }) 261

Kerrataan määritelmiä: solmujono (v 1,..., v k ) on polku jos (v i, v i+1 ) E kaikilla 1 i k 1 polku (v 1,..., v k ) on yksinkertainen jos v 1, v 2,..., v k ovat kaikki eri solmuja polku (v 1,..., v k ) on kehä jos v 1 = v k kehä (v 1,..., v k ) on yksinkertainen jos v 1, v 2,..., v k 1 ovat kaikki eri solmuja Huomaa erikoistapaus: jos (u, v) E niin (u, v) on yksinkertainen kehä. Määritellään nyt kaarijoukossa E ekvivalenssirelaatio seuraavasti: e e jokin yksinkertainen kehä sisältää sekä kaaren e että kaaren e. Olkoot relaation ekvivalenssiluokat E 1,..., E k. Kun i = 1,..., k, muodostukoon V i V niistä solmuista, jotka esiintyvät luokan E i kaaren päätepisteenä. Verkon G 2-yhtenäiset komponentit ovat nyt osaverkot G i = (V i, E i ), i = 1,..., k. 262

Lemma Olkoon G = (V, E) yhtenäinen, ja sen 2-yhtenäiset komponentit G i = (V i, E i ), i = 1,..., k. 1. G i on 2-yhtenäinen kaikilla i. 2. Jos i j niin V i V j 1. 3. a on verkon G artikulaatiopiste joss a V i V j joillain i j. Todistus Selvästi kaikki G i ovat yhtenäisiä. (1): Olkoon a, u, v V i. Väitetään, että jos a { u, v } niin solmujen u ja v välillä on ainakin yksi polku joka ei kulje solmun a kautta. Jos (u, v) E i, asia on selvä. Muuten on olemassa kaksi eri kaarta (u, u ) E i ja (v, v ) E i, ja nämä kaaret ovat jollakin yksinkertaisella kehällä. Kehä antaa kaksi eri polkua solmujen u ja v välille, ja a voi olla vain toisella niistä. 263

(2): Tehdään vastaoletus { u, v } V i V j, i j, u v. Koska ei voi olla V i V j, on olemassa jokin x V i { u, v }. Tällä x on olemassa joukon E i kaarista koostuva kehä, joka kulkee solmujen u, v ja x kautta. Vastaavasti jollain y V j { u, v } jokin joukon E j kaarista koostuva kehä kulkee pisteiden u, v ja y kautta. Näiden kehien paloja yhdistämällä saadaan yksinkertainen kehä, joka sisältää kaaria sekä joukosta E i että joukosta E j ; ristiriita. u u v v komponentin E i kaaria komponentin E j kaaria. 264

(3), : Olkoon a verkon G artikulaatiopiste. Siis joillain u, v kaikki polut u v kulkevat pisteen a kautta. Olkoon jollain tällaisella polulla x ja y solmua a välittömästi ympäröivät solmut: u x a y v. Jos kaaret (x, a) ja (a, y) kuuluisivat samaan komponenttiin, ne olisivat jollain yksinkertaisella kehällä. Tästä kehästä saataisiin solmujen u ja v välille vaihtoehtoinen polku joka ei kulje solmun a kautta; ristiriita. Siis (x, a) E i ja (a, y) E j joillain i j, ja tällöin a V i V j. (3), : Olkoon a V i V j, i j. Siis (x, a) E i ja (a, y) E j joillain x, y. Jos solmujen x ja y välillä olisi polku, joka ei kulje solmun a kautta, syntyisi kehä jolla olisi kaaret (x, a) E i ja (a, y) E j ; ristiriita. Siis kaikki polut x y kulkevat solmun a kautta ja se on artikulaatiopiste. 265

Tavoitteena on löytää artikulaatiopisteet ja 2-yhtenäiset komponentit syvyyssuuntaisen haun yhteydessä. Tarkastellaan ensin, miten artikulaatiopisteet tunnistetaan, jos syvyyssuuntainen virittävä puu T ja takautuvat kaaret E T on valmiiksi annettu. Jos a ei ole artikulaatiopiste, erityisesti solmun a jokaisesta lapsesta on solmun a isään polku, joka ei kulje solmun a kautta. Koska sivuttaiskaaria ei ole, tällä polulla on oltava kaari solmun a jälkeläisestä solmun a aitoon esivanhempaan. Tarkemmin pätee seuraava: Lause Olkoon verkko G = (V, E) yhtenäinen ja S = (V, T ) sen syvyyssuuntainen virittävä puu. Nyt a V on verkon G artikulaatiopiste joss 1. a on puun S juuri ja sillä on ainakin kaksi lasta, tai 2. a ei ole puun S juuri ja sillä on lapsi s, jonka mistään jälkeläisestä (s itse mukaanlukien) ei ole takautuvaa kaarta mihinkään solmun a aitoon esivanhempaan. 266

Todistus Tapaus jossa a on juuri on selvä. Oletetaan että a ei ole juuri. : Oletetaan, että a ei ole artikulaatiopiste ja s on solmun a lapsi. Siis erityisesti solmusta s on polku (v 1,..., v k ) solmun a vanhempaan p kulkematta solmun a kautta. Olkoon j pienin, jolla v j ei ole solmun s jälkeläinen. Tällainen j on olemassa, koska v k = p ei ole solmun s jälkeläinen. Koska sivuttaiskaaria ei ole, v j on solmun s aito esivanhempi. Koska lisäksi v j a, kaari (v j 1, v j ) on takautuva kaari solmun s jälkeläisestä solmun a aitoon esivanhempaan. 267

: Oletetaan että jokaisella solmun a lapsella s on jälkeläinen v, josta on takautuva kaari johonkin solmun a aitoon esivanhempaan. Väitetään, että kaikilla x, y V on polku x y kulkematta solmun a kautta. Väitetään, että kummastakin solmusta x ja y on puun juureen polku kulkematta solmun a kautta. Väite selvästi seuraa tästä. Todistus on sama solmuille x ja y, tarkastellaan tapausta x. Jos x ei ole solmun a jälkeläinen, haluttu polku muodostuu suoraan puukaarista. Olkoon x nyt solmun a jälkeläinen. Olkoon s se solmun a lapsi, jonka jälkeläinen x on, ja olkoon v solmun s jälkeläinen, josta on takautuva kaari solmun a aitoon esivanhempaan w. Solmusta x solmuun v päästään puukaaria pitkin solmuun v nousematta solmun s yläpuolelle ja erityisesti käymättä solmussa a. Kaari (v, w) oletuksen mukaan ei sisällä solmua a. Solmusta w päästään juureen suoraan puukaaria pitkin kulkematta solmun a kautta. 268

Edellä esitetyn ehdon tehokas tarkastaminen perustuu ns. Low-arvojen laskemiseen. Käytetään yksinkertaisuuden vuoksi solmujen niminä niiden esinumeroita; siis v = prenum[v]. Kullakin v olkoon A(v) niiden solmujen joukko, joihin on kaari jostain solmun v jälkeläisestä. Huomaa, että joukossa A(v) on vain solmun v jälkeläisiä ja esivanhempia. Asetetaan Low[v] = min ({ v } A(v)). Siis Low[v] on juurta lähinnä oleva solmu, johon pääsee solmusta v kulkemalla ensin puussa alaspäin ja sitten mahdollisesti kerran ylöspäin pitkin takautuvaa kaarta. Erityisesti solmun a lapsen s jostain jälkeläisestä on takautuva kaari johonkin solmun a aitoon esivanhempaan joss Low[s] < a. Siis a on artikulaatiopiste joss jollain sen lapsella s pätee Low[s] a. Low-arvot saadaan selvästi palautuskaavasta Low[v] = min({ v } { w (v, w) takautuva } { Low[w] w solmun v lapsi }) 269

Lasketaan nyt Low-arvot tällä palautuskaavalla syvyyssuuntaisen haun yhteydessä. Koska verkko oletetaan yhtenäiseksi, yksi ylätason kutsu seuraavaan proseduuriin DFS-Visit2 millä tahansa solmulla käy koko verkon läpi. DFS-Visit2(v): pre := pre + 1; prenum[v] := pre new[v] := False Low[v] := prenum[v] for w L[v] do if new[w] then T := T { (v, w) } p[w] := v DFS-Visit2(w) if Low[w] prenum[v] then v on artikulaatiopiste tai puun juuri Low[v] := min { Low[v], Low[w] } else if w p[v] then % (v, w) takautuva Low[v] := min { Low[v], prenum[w] } Edellä esitettyjen ominaisuuksien perusteella helppo induktio osoittaa, että algoritmi laskee Low-arvot ja tunnistaa artikulaatiopisteet oikein, kunhan vielä puun juuri käsitellään erikoistapauksena. Katsomme vielä, miten saamme tulostetuksi 2-yhtenäiset komponentit. 270

Algoritmi: 2-yhtenäiset komponentit 1. Alusta T :=, pre := 0; P := tyhjä pino, new[v] := True kaikilla v. 2. Suorita DFS-Visit2(v 0 ) mielivaltaisella v 0 V. Aina kun algoritmi löytää solmun w L[v], paina kaari (v, w) pinoon P ellei sitä ole jo aiemmin painettu. Kun DFS-Visit2(v) solmua w käsitellessään toteaa, että v on artikulaatiopiste tai juuri, poista pinosta kaaret kaareen (v, w) asti (tämä mukaanlukien). Nämä kaaret muodostavat yhden 2-yhtenäisen komponentin. Seuraavaksi katsomme ensin esimerkin algoritmin toiminnasta ja todistamme sitten sen aikavaativuuden ja oikeellisuuden. 271

1 1 2 9 2 3 9 3 8 4 8 4 7 5 6 5 Verkko 6 7 Virittävä puu ja takautuvat kaaret v 1 2 3 4 5 6 7 8 9 Low[v] 1 1 2 4 4 4 4 2 1 (1, 2)(2, 3)(3, 4) (4, 5)(5, 6)(6, 4)(5, 7)(7, 4) }{{} (1, 2)(2, 3) (3, 4) }{{} (1, 2) (2, 3)(3, 8)(8, 2) }{{} (1, 2)(2, 9)(9, 1) }{{} Pinon kehitys ja tulostetut komponentit 272

Aikavaativuus: Syvyyssuuntaisen haun analyysista seuraa, että aikavaativuus on O( V + E ), kunhan osoitetaan miten vakioajassa testataan onko kaari (v, w) joskus aiemmin painettu pinoon. 1. Jos new[w] = True, kaarta ei ole aiemmin kohdattu eikä siis etenkään painettu pinoon. 2. Jos new[w] = False ja v < w, niin w on solmun v jälkeläinen, joten (v, w) on viety pinoon. 3. Jos new[w] = False, w < v ja w = p[v], niin kaari (v, w) on viety pinoon juuri ennen kutsua DFS-Visit2(v). 4. Jos new[w] = False, w < v ja w p[v], niin w on solmun v kaukaisempi esivanhempi josta kuitenkaan ei tultu suoraan solmuun v, joten kutsussa DFS-Visit2(w) ei vielä ole ehditty listan L[w] alkioon v eikä kaarta (v, w) siis ole painettu pinoon. Siis voidaan testata vakioajassa, onko kaari (v, w) aiemmin viety pinoon. (Tapauksessa 2 se on voitu jo ehtiä poistaakin pinosta.) Koska verkko on yhtenäinen, E V 1 ja aikavaativuudeksi tulee O( E ). 273

Lause Algoritmi tulostaa oikeat 2-yhtenäiset komponentit. Todistus Kaikilla w pätee Low[w] v 0, missä v 0 on puun juuri. Siis kaikilla juuren lapsilla w pino tyhjennetään kutsun DFS-Visit2(w) päätyttyä. Erityisesti lopuksi pino on tyhjä ja jokainen kaari on tulostettu tasan kerran. Todistetaan induktiolla komponenttien lukumäärän b suhteen, että kullakin kerralla tulostettavat kaaret muodostavat yhden kokonaisen komponentin. Tapauksessa b = 1 verkossa ei ole artikulaatiopisteitä, joten juurella on tasan yksi lapsi. Kun tämä lapsi on käsitelty, pinossa on kaikki verkon kaaret, jotka tulostetaan. 274

Oletetaan, että algoritmi toimii, kun komponentteja on b 1. Olkoot v ja w ne solmut, joiden kohdalla ensimmäisen kerran käy Low[w] v kun v = p[w]. Siis v on ensimmäinen löydetty artikulaatiopiste, ja ennen kutsun DFS-Visit2(w) päättymistä pinosta ei ole poistettu mitään. Täten kutsun DFS-Visit2(w) päätyttyä tulostetaan ja poistetaan tasan ne kaaret, joilla ainakin toinen päätepiste on solmun v jälkeläinen. Selvästi nämä kaaret muodostavat yhden 2-yhtenäisen komponentin. Ensimmäisen komponentin tulostamisen jälkeen algoritmi toimii kuten sillä verkolla, joka saadaan poistamalla ensimmäinen komponentti mutta jättämällä solmu v. Induktio-oletuksesta siis seuraa, että loputkin komponentit tulostuvat oikein. 275