10. Painotetut graafit



Samankaltaiset tiedostot
10. Painotetut graafit

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

13 Lyhimmät painotetut polut

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

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

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

Algoritmit 2. Luento 2 To Timo Männikkö

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

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Pienin virittävä puu (minimum spanning tree)

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Johdatus graafiteoriaan

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

Graafin virittävä puu 1 / 20

Algoritmit 2. Luento 11 Ti Timo Männikkö

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

A TIETORAKENTEET JA ALGORITMIT

PARITUS KAKSIJAKOISESSA

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

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

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 14 Ke Timo Männikkö

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

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

T : Max-flow / min-cut -ongelmat

4. Joukkojen käsittely

A TIETORAKENTEET JA ALGORITMIT

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

Algoritmit 2. Luento 9 Ti Timo Männikkö

8. Lajittelu, joukot ja valinta

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Tiraka, yhteenveto tenttiinlukua varten

Algoritmit 2. Luento 12 Ke Timo Männikkö

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

Malliratkaisut Demot

Algoritmit 1. Luento 1 Ti Timo Männikkö

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Verkon virittävät puut

Algoritmit 1. Luento 2 Ke Timo Männikkö

Luku 8. Aluekyselyt. 8.1 Summataulukko

Algoritmit 2. Demot Timo Männikkö

811312A Tietorakenteet ja algoritmit I Johdanto

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

14. Luennon sisältö. Kuljetustehtävä. Verkkoteoria ja optimointi. esimerkki. verkkoteorian optimointitehtäviä verkon virittävä puu lyhimmät polut

6.4. Järjestyssuhteet

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

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Tietorakenteet ja algoritmit. Verkot. Ari Korhonen

9. Graafit Graafin abstrakti tietotyyppi

Verkon värittämistä hajautetuilla algoritmeilla

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

TIE Tietorakenteet ja algoritmit 261

Datatähti 2019 loppu

Algoritmit 1. Luento 8 Ke Timo Männikkö

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

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Algoritmit 2. Luento 8 Ke Timo Männikkö

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Harjoitus 4 ( )

Ohjelmoinnin peruskurssi Y1

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

0 v i v j / E, M ij = 1 v i v j E.

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

Algoritmit 2. Demot Timo Männikkö

Diskreetit rakenteet

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

Tietorakenteet, laskuharjoitus 7, ratkaisuja

7.4. Eulerin graafit 1 / 22

Harjoitus 1 ( )

Graafin 3-värittyvyyden tutkinta T Graafiteoria, projektityö (eksakti algoritmi), kevät 2005

Silmukkaoptimoinnista

Algoritmit 2. Luento 5 Ti Timo Männikkö

6. Approksimointialgoritmit

isomeerejä yhteensä yhdeksän kappaletta.

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

Harjoitus 3 ( )

Algoritmit 1. Luento 10 Ke Timo Männikkö

v 8 v 9 v 5 C v 3 v 4

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 1. Luento 3 Ti Timo Männikkö

Nopea kertolasku, Karatsuban algoritmi

Königsbergin sillat. Königsberg 1700-luvulla. Leonhard Euler ( )

Johdatus graafiteoriaan

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Tietorakenteet ja algoritmit - syksy

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

Algoritmit 2. Luento 13 Ti Timo Männikkö

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

Algoritmit 2. Luento 14 To Timo Männikkö

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

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811120P Diskreetit rakenteet

Transkriptio:

10. Painotetut graafit Esiintyy monesti sovelluksia, joita on kätevä esittää graafeina. Tällaisia ovat esim. tietoverkko tai maantieverkko. Näihin liittyy erinäisiä tekijöitä. Tietoverkkoja käytettäessä on monesti hyödyllistä tietää nopein tietoliikenneyhteys eri pisteiden välillä tämähän riippuu mm., mitä teknologiaa käyttäen yhteydet on rakennettu. Maantieverkossa merkitsevät konkreettiset etäisyydet. Näitä, kuten lukemattomia muitakin, voidaan esittää painotettuina graafeina (weighted graph), joista on lentoreittiesimerkki kuvassa 10.1. Jokaiseen kaareen e = (u,v) liitetään painoarvo (tässä kokonaisluku) w(e). Tässä luvussa pohditaan painotettuihin graafeihin liittyviä lyhimmän polun ongelmaa ja minimivirittävien puiden ongelmaa. 867 740 Kuva 10.1. Esimerkki painotetusta graafista, jossa solmut ovat lentokenttiä ja kaaret on painotettu niiden välisillä etäisyyksillä maileissa. 10. luku 507 10. luku 508 10.1. Lyhimmät polut Olkoon G = (V,E) painotettu graafi, missä V on solmujen joukko ja E kaarien joukko. Määritellään G:ssä polun P = ( (v 1, v 2 ), (v 2, v 3 ), (v 3, v 4 ),, (v k 1, v k )) pituus tai paino tai kustannus (length, weight, cost) polun kaarien painojen summana: k 1 = i+ i= 1 w( P) w(( v i, v 1)). Ahne menetelmä Esitetään ahne lähestymistapa yhden lähtösolmun lyhimmän polun (single source shortest path) ongelmaan, jossa etsitään lyhin polku lähtien aloitusolmusta v jokaiseen muuhun graafin solmuun. Esitettävä menetelmä on tavallaan painotetun graafin leveyshaku. Ahne menetelmä kasvattaa iteratiivisesti solmujen pilveä lähtien aloitussolmusta. Kullakin iteraatiolla valitaan seuraava pilven ulkopuolinen, lähin solmu, joka lisätään pilveen. Tätä toistetaan, kunnes kaikki solmut on lisätty, jolloin on olemassa polku aloitussolmusta kaikkiin muihin. Määritellään etäisyys (distance) d(v,u) graafin G solmusta v solmuun u näiden välisen lyhimmän polun pituutena edellyttäen, että sellainen polku on olemassa (jos ei ole, voidaan merkitä äärettömäksi). Yleensä painot ilmaistaan ei negatiivisina lukuina. Negatiivisiakin voidaan erikoismerkityksissä joskus soveltaa, mutta ne aiheuttavat omat rajoituksensa eikä tässä käsitellä niitä. 10. luku 509 Lähestymistapa perustuu ahneeseen (greedy method) algoritmien suunnittelumenetelmään. Se soveltuu yleisesti tilanteessa, jossa yritetään optimoida jotakin funktiota yli kohteiden kokoelman tässä funktio on lyhimmän polun etäisyys. Perusajatuksena on lisätä yksi kerrallaan valiten se niin, että saadaan funktion optimiarvoa. 10. luku 510

Yhden lähtösolmun lyhimmän polun ongelman tapauksessa ahne menetelmä tuottaa täysin oikein (optimiarvon antavan) toimivan algoritmin, nk. Dijkstran algoritmin (Dijkstra s algorithm). Sovellettaessa ahnetta menetelmää johonkin toiseen ongelmaan se ei välttämättä anna optimaalista tulosta, vaan lähes parhaan. Tällainen on mm. kauppamatkustajan ongelma (travelling salesman problem), jossa etsitään lyhintä polkua, kun pitää käydä kaikki graafin solmut tarkalleen kerran. Dijkstran algoritmin toteutus Käytetään eräässä mielessä etäisyysfunktion approksimaatiota, josta lopulta päästään todelliseen etäisyyteen. Määritellään jokaiselle V:n solmulle u D[u] approksimoiduksi etäisyydeksi solmusta v. D[u] käsittää kulloinkin parhaimman löydetyn polun eli kyseisellä hetkellä lyhimmän. Aluksi jokaiselle solmulle u v määritellään D[v] = 0 ja D[u] = +. Määritellään solmujen joukko C, pilvi, aluksi tyhjäksi. Ensimmäisenä iteraationa asetetaan aloitussolmu v joukkoon C. Seuraavilla iteraatioilla valitaan pienin D[u], kun u ei ole vielä joukossa, ja siirretään u joukkoon C. Tämän yhteydessä päivitetään kaikkien sellaisten solmujen z etäisyydet, jotka solmut ovat u:n vierekkäisiä ja eivät ole vielä joukossa C. Tämä kuvaa sitä, että voi olla uusi lyhyempi polku solmuun z kuin tähän asti tunnettu lyhin. Tämä päivitysoperaatio on relaksaatio (relaxation), sillä se tarkastaa, voidaanko vanhaa estimaattia parantaa lähemmäksi todellista arvoaan (minimietäisyyttä). Kaaren relaksaatio operaatio on nyt: if D[u] + w((u,z)) < D[z] then D[z] D[u] + w((u,z)) Pseudokoodi Dijkstran algoritmia varten on koodina 10.1., ja sitä havainnollistetaan kuvassa 10.2. 10. luku 511 10. luku 512 Algorithm ShortestPath(G,v): Input: Painotettu graafi G ja tästä aloitussolmu v. Output: Jokaiselle solmulle u arvo D[u], missä D[u] on lyhimmän polun pituus solmusta v solmuun u graafissa. alustetaan arvot D[v] = 0 ja D[u] = + jokaiselle solmulle u v olkoon Q prioriteettijono, joka käsittää kaikki graafin G solmut ja jossa avaimina ovat arvot D while Q do {valitaan u pilveen C} u Q.removeMinElement() for jokaiselle u:n vierekkäiselle solmulle z prioriteettijonosta Q do {suoritetaan relaksaatio operaatio kaarelle (u,z)} if D[u] + w((u,z)) < D[z] then D[z] D[u] + w((u,z)) vaihdetaan z:n avainarvo Q:sta uudeksi arvoksi D[z] return jokaisen solmun u arvo D[u] Koodi 10.1. (alku) Dijkstran algoritmin pseudokoodi. Prioriteettijonossa Q ovat ne solmut, jotka eivät ole vielä pilvessä C. Koodi 10.1. (loppu) Dijkstran algoritmin pseudokoodi. Prioriteettijonossa Q ovat ne solmut, jotka eivät ole vielä pilvessä C. 10. luku 513 10. luku 514

621 740 0 Kuva 10.2. (alku) Dijkstran algoritmin suoritus. Solmun viereinen arvo on D[v] (suorakaiteessa). (a) 621 621 740 0 Kuva 10.2. (jatkoa) Löydetty lyhin polku on piirretty paksulla nuolella. Pilven ulkopuoliset, viereiset solmut osoitetaan paksulla kaarella, kun näille on löydetty nykyinen (paras) kaari. (b) 10. luku 515 10. luku 516 621 0 1575 (c) 328 621 0 1575 (d) 328 Kuva 10.2. (jatkoa) Kuva 10.2. (jatkoa) 10. luku 517 10. luku 518

3075 621 0 1575 (e) 328 2467 621 0 1423 (f) 328 Kuva 10.2. (jatkoa) Kuva 10.2. (jatkoa) 10. luku 519 10. luku 520 2467 3288 621 0 1423 (g) 328 2467 2658 621 0 1423 (h) 328 Kuva 10.2. (jatkoa) Kuva 10.2. (jatkoa) 10. luku 521 10. luku 522

2467 2658 621 0 1423 (i) 328 2467 2658 621 0 1423 (j) 328 Kuva 10.2. (jatkoa) Kuva 10.2. (loppu) 10. luku 523 10. luku 524 Miksi Dijkstran algoritmi toimii halutulla tavalla? Perusteena on se, että solmuun u liitetty arvo D[u] päivitetään asianmukaisesti ja valittaessa juuri solmu u pilveen C mukaan se poistetaan samalla prioriteettijonosta Q. Seuraava lause, jonka perustelu sivuutetaan, kiteyttää olennaisimman. Lause 10.1. Otettaessa solmu u mukaan pilveen C arvo D[u] on yhtä suuri kuin d(v,u), lyhin polku solmusta v solmuun u. Tämä pitää paikkansa jokaiselle graafin G solmulle u. Dijkstran algoritmi kuvattiin melko abstraktilla tasolla. Täten sen suoritusaika riippuu määrätyn yksityiskohdan, prioriteettijono, toteutuksesta. Graafi G on mielekästä toteuttaa vierekkyyslistana, koska tällöin päästään nopeasti vierekkäisiin solmuihin (suoraan suhteessa näiden määrään) relaksaatio operaation aikana. Dijkstran algoritmin suoritusaikojen käsittely on hieman pitkällinen, joten todetaan vain yhteenvedonomaisesti seuraavat seikat. Jos prioriteettijono toteutetaan eräin erikoisominaisuuksin (ei selosteta tällä kurssilla) varustettuna kekona (heap), saadaan pahimman tapauksen suoritusajaksi O((n + m) log n), missä n on solmujen ja m kaarien määrä. Tulos voidaan esittää pelkästään solmujen määrän n funktiona muodossa O(n 2 log n). Toteutettaessa prioriteettijono järjestämättömänä sekvenssinä eräät sen operaatiot mahdollistavat niiden nopean käytön, jolloin suoritusaika on O(n 2 + m). Tämä voidaan muokata muotoon O(n 2 ). Huolimatta näistä tuloksista keko on monesti parempi, jos kaarien lukumäärä verrattuna solmujen määrään ei ole suuri. Myös keskimääräisen suoritusajan tilanteessa keko on monesti käytännössä parempi. 10. luku 525 10. luku 526

10.2. Minimivirittävät puut Olkoon esimerkkinä rakennuksen tietokoneiden yhdistäminen kaapelein käyttäen kaapelia minimimäärän. Tätä voidaan mallintaa painotetun graafin ongelmana laatimalla graafi G, jossa jokainen solmu vastaa tietokonetta ja määrätään paino w((v,u)) kaarelle (v,u). Paino vastaa tarvittua kaapelia yhdistämään solmu v solmuun u. Nyt ei ole kysymys lyhimmän polun laskemisesta jostakin tietystä solmusta lähtien, vaan halutaan muodostaa puu T, joka sisältää kaikki G:n solmut ja jolla on pienin painojen summa w( T ) = w(( v, u)) ( v, u) T kaikkien mahdollisten tällaisten puiden joukosta. Esitetään kaksi ahnetta algoritmia minimivirittävän puun klassista ongelmaa varten. Ennen näitä tarkastellaan kuitenkin oheista lausetta ja siihen liittyvää kuvaa 10.3. Lause 10.2. Olkoon G = (V, E) painotettu yhdistetty graafi. Olkoot V 1 ja V 2 kaksi erillistä, ei tyhjää joukkoa sekä lisäksi V =V 1 V 2. Olkoon vielä eg:n kaari, kun tämä on yksi sellaisista, joiden toinen pää on joukossa V 1 ja toinen joukossa V 2. Silloin on minimivirittävä puu T, jolla on e yhtenä kaaristaan ( siltakaari ). Puu, joka käsittää kaikki G:n solmut, on virittävä puu (spanning tree), kuten aiemmin on mainittu. Pienimmän painojen summan käsittävä virittävä puu on minimivirittävä puu (minimum spanning tree, MST) 10. luku 527 Perustelu sivuutetaan. 10. luku 528 Kruskalin algoritmi e minimipainoinen siltakaari Edellistä lausetta käytetään perustana minimivirittävän puun muodostamisessa. Kruskalin algoritmissa sellainen muodostetaan klustereista eli rypäistä. Aluksi kukin solmu muodostaa oman erillisen klusterinsa. Algoritmi käy kaaret läpi kasvavassa painojärjestyksessä. Jos kaari e yhdistää kaksi erillistä klusteria, e lisätään minimivirittävää puuta muodostavaan kaarien joukkoon ja kyseiset klusterit yhdistetään e:llä yhdeksi klusteriksi. Jos toisaalta e yhdistää kaksi jo samassa klusterissa olevaa solmua, e hylätään. Kun kaaria on lisätty tarpeeksi, jotta minimivirittävä puu on syntynyt, algoritmin suoritus päättyy. Kruskalin algoritmi on koodina 10.2. Kuva 10.4. esittää algoritmin toimintaa. Kuva 10.3. Askel minimivirittävän puun muodostamisesta. 10. luku 529 10. luku 530

Algorithm Kruskal(G): Input: yhdistetty painotettu graafi G, jossa on n solmua ja m kaarta Output: graafin G minimivirittävä puu T for jokaiselle G:n solmulle v do määritellään klusteri C(v) {v} alustetaan prioriteettijono Q käsittämään kaikki G:n kaaret käyttäen painoja avaimina T {lopuksi T sisältää minimivirittävän puun kaaret} while Q do poistetaan Q:sta kaari (v,u), jonka paino on pienin olkoon C(v) solmun v sisältävä klusteri ja olkoon C(u) solmun u sisältävä klusteri if C(v) C(u) then lisätään kaari (v,u) puuhun T yhdistetään C(v) ja C(u) yhdeksi klusteriksi eli näiden unioniksi return puu T 867 621 740 (a) 849 Kuva 10.4. (alku) Kruskalin algoritmin toiminnasta esimerkki: (a) alkutilanteen klusterit on merkitty taustavärillä. Koodi 10.2. Kruskalin algoritmi. 10. luku 531 10. luku 532 (b) (c) Puuhun käytetty kaari on merkitty vahvennettuna. 10. luku 533 10. luku 534

(d) (e) 10. luku 535 10. luku 536 (f) (g) Hylätyt kaaret esitetään katkoviivoina. 10. luku 537 10. luku 538

(h) (i) 10. luku 539 10. luku 540 (j) (k) 10. luku 541 10. luku 542

(l) (m) 10. luku 543 10. luku 544 Kuva 10.4. (loppu) 621 740 (n) 10. luku 545 Ei perehdytä Kruskalin algoritmin perusteisiin tätä enempää, mutta oletetaan prioriteettijonon toteutetun kekona. Tällöin suoritusaika on seuraavan lauseen mukainen. Lause 10.3. Annetun yhdistetyn painotetun graafin G sisältäessä n solmua ja m kaarta Kruskalin algoritmi etsii siitä minimivirittävän puun ajassa O(m log n). Prim Jarnik algoritmi Tässä algoritmissa, josta käytetään useimmin nimitystä Primin algoritmi, minimivirittävää puuta kasvatetaan yhden solmun klusterista, joka käsittää aluksi juurisolmun v. Sen idea muistuttaa Dijkstran algoritmia. Aloitetaan solmusta v. Tätä C:tä kasvatetaan määräämällä jokaisella iteraatiolla kaari e = (v,u), jonka paino on pienin sekä jonka solmu v on C:ssä ja solmu u tämän ulkopuolella. Solmu u otetaan C:hen mukaan. Prosessia toistetaan, kunnes minimivirittävä puu on muodostunut. Taas ylläpidetään solmua varten arvoa D[u], joka käsittää ko. hetkellä parhaimman kaaren painon liitettäessä solmua u C:hen. 10. luku 546

Algoritmi esitetään pseudokoodina (koodi 10.3) ja toiminta kuvana 10.5. Algorithm PrimJarnik(G): Input: painotettu yhdistetty graafi G, jossa on n solmua ja m kaarta Output: G:n minimivirittävä puu T Otetaan jokin solmu vg:stä D[v] 0 for jokaiselle solmulle u v do D[u] + alustetaan T alustetaan prioriteettijono Q, jonka avaimet ovat D:n arvot ja alkiot solmu kaari parit lisätään pari (v, ) Q:hun prioriteetilla D[v] while Q do (u,e) Q.removeMinElement() lisätään solmu u ja kaari e puuhun T for jokaiselle solmun u vierekkäiselle solmulle z, joka on Q:ssa do {suoritetaan relaksaatio operaatio kaarelle (u,z)} if w((u,z)) < D[z] then D[z] w((u,z)) vaihdetaan z:aan liittyvä kaari Q:sta kaareksi (u,z) return puu T Koodi 10.3. (loppu) Prim Jarnik algoritmi minimivirittävän puun etsimiseksi. Koodi 10.3. (alku) Prim Jarnik algoritmi minimivirittävän puun etsimiseksi. 10. luku 547 10. luku 548 867 849 621 740 (a) (b) Kuva 10.5. (alku) Prim Jarnik algoritmin toiminnasta esimerkki. 10. luku 549 10. luku 550

(c) (d) 10. luku 551 10. luku 552 (e) (f) 10. luku 553 10. luku 554

(g) (h) 10. luku 555 10. luku 556 (i) (j) Kuva 10.5. (loppu) 10. luku 557 10. luku 558

Algoritmin suoritusaika on samaa luokkaa kuin Kruskalin, mikä mainitaan perusteluitta. Tämä edellyttää prioriteetijonon toteutusta kekona. Lause 10.4. Olkoot yhdistetyssä painotetussa graafissa G solmujen määrä n ja kaarien määrä m. Prim Jarnik algoritmi löytää minimivirittävän puun G:lle ajassa O(m log n). Algoritmia on mahdollista edelleen tehostaa prioriteettijonoa tehostamalla, jolloin se toimii ajassa O(n log n + m) (kaarien määrä on siis yleensä olennaisesti suurempi kuin solmujen; vrt. lause 9.3.). 10. luku 559