Grafové algoritmy III.

Podobné dokumenty
Použití dalších heuristik

Algoritmy na ohodnoceném grafu

STROMY A KOSTRY. Stromy a kostry TI 6.1

Dynamické datové struktury III.

Grafové algoritmy. Programovací techniky

TGH08 - Optimální kostry

Grafové algoritmy. Programovací techniky

Základní datové struktury III: Stromy, haldy

STROMY A KOSTRY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze. BI-GRA, LS 2010/2011, Lekce 6

Dynamické datové struktury IV.

Stromy, haldy, prioritní fronty

Vzdálenost uzlů v neorientovaném grafu

07 Základní pojmy teorie grafů

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Dynamické datové struktury I.

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Prioritní fronta, halda

Úvod do teorie grafů

Dynamické programování

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

TGH07 - Chytré stromové datové struktury

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Algoritmizace prostorových úloh

Kostry. 9. týden. Grafy. Marie Demlová (úpravy Matěj Dostál) 16. dubna 2019

4EK311 Operační výzkum. 5. Teorie grafů

bfs, dfs, fronta, zásobník, prioritní fronta, halda

TGH07 - Chytré stromové datové struktury

Drsná matematika III 10. demonstrovaná cvičení Kostry grafů

bfs, dfs, fronta, zásobník, prioritní fronta, halda

6. Tahy / Kostry / Nejkratší cesty

TGH06 - Hledání nejkratší cesty

1. Minimální kostry Od mìsteèka ke kostøe

TGH06 - Hledání nejkratší cesty

Paralelní grafové algoritmy

Hledáme efektivní řešení úloh na grafu

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Dynamické datové struktury II.

Grafy. RNDr. Petra Surynková, Ph.D. Univerzita Karlova v Praze Matematicko-fyzikální fakulta.

TGH05 - aplikace DFS, průchod do šířky

Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT

Jan Březina. 7. března 2017

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

TGH05 - aplikace DFS, průchod do šířky

Stromy. Jan Kybic.

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Algoritmy a datové struktury

Stromy. Jan Hnilica Počítačové modelování 14

Matice sousednosti NG

Algoritmus pro hledání nejkratší cesty orientovaným grafem

H {{u, v} : u,v U u v }

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

Grafové algoritmy. Programovací techniky

Matematika III 10. přednáška Stromy a kostry

Union-Find problém. Kapitola 1

Jarníkův algoritmus. Obsah. Popis

Metody síťové analýzy

TEORIE GRAFŮ TEORIE GRAFŮ 1

TOKY V SÍTÍCH II. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Teorie grafů. Kostra grafu. Obsah. Radim Farana Podklady pro výuku pro akademický rok 2013/2014

PLANARITA A TOKY V SÍTÍCH

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Optimalizace & soft omezení: algoritmy

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

Důkaz správnosti Zbývá dokázat, že nalezená kostra vstupního grafu je minimální. Bez újmy na obecnosti

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Graf. Uzly Lokality, servery Osoby fyzické i právní Informatické objekty... atd. Hrany Cesty, propojení Vztahy Informatické závislosti... atd.

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Algoritmizace prostorových úloh

Binární vyhledávací stromy pokročilé partie

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

STROMY. v 7 v 8. v 5. v 2. v 3. Základní pojmy. Řešené příklady 1. příklad. Stromy

Teorie grafů BR Solutions - Orličky Píta (Orličky 2010) Teorie grafů / 66

Úvod do informatiky. Miroslav Kolařík

Učební texty k státní bakalářské zkoušce Matematika Teorie grafů. študenti MFF 15. augusta 2008

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Časová a prostorová složitost algoritmů

8 Přednáška z

ALGORITMY A DATOVÉ STRUKTURY

SQL tříhodnotová logika

Triangulace. Význam triangulace. trojúhelník je základní grafický element aproximace ploch předzpracování pro jiné algoritmy. příklad triangulace

Rekurzivní algoritmy

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

5 Rekurze a zásobník. Rekurzivní volání metody

Dynamické programování. Optimální binární vyhledávací strom

Algoritmy výpočetní geometrie

Základy informatiky. 07 Teorie grafů. Kačmařík/Szturcová/Děrgel/Rapant

Algoritmy používané ve výpočetní geometrii

Prioritní fronta a příklad použití v úloze hledání nejkratších cest

5 Minimální kostry, Hladový algoritmus

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Grafy (G) ρ(h) = [u,v]

Jak je vidět z obrázku 1.1, jeden graf může mít více minimálních koster. Brzy

TGH09 - Barvení grafů

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

Transkript:

Grafové algoritmy III. Minimální kostra. Borůvkův/Kruskalův algoritmus. Jarníkův/Primův algoritmus. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. / 6

Obsah přednášky Úvod Kostra grafu Borůvkův/Kruskalův algoritmus Jarníkův/Primův algoritmus / 6

Úvod. Úvod : Minimum Spanning Tree. Podgraf, faktor, strom, minimální váha hran. Faktor: podgraf G obsahující všechny uzly G. Úloha může mít více řešení. Často řešeno v dopravě, energetice, telekomunikacích. Optimální zásobovací sít, udržení sjízdnosti silnic, železniční spojení. Elektronika, návrh plošných spojů (L norma). Z hlediska spolehlivosti není optimální. Výpadek hrany: rozpad G na nesouvislé grafy. Důsledek: přerušení dodávky energie, neprůjezdnost (nehoda), atd. Kritické části infrastruktury nutno posílit: zdvojení. Předpoklad G neorientovaný, souvislý, nezáporné hrany. / 6

. Laplaceova matice grafu Regulární matice L( U, U ). Zachycuje stupně uzlů a incidenci. Laplaceova matice L = [l ij ] deg(u j ), i = j, l ij =, i j (u i, u j ) G, 0, jinak. Alternativně, L = D V, kde D( U, U ) matice stupňů uzlu, { U j= d ij = v ij, i = j, 0, i j, V ( U, U ) maticí incidence. Úplný graf n n L =......... n

. Výpočet Laplaceovy matice: G 8 6 7

. Výpočet Laplaceovy matice pro G L = D V, 0 0 0 0 0 0 0 0 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.,

. Kostra grafu Graf G = (H, U, ρ), neorientovaný, m = H, n = U. K = (H k, U, ρ k ), faktor G, který je stromem, tvořena n hranami n k = H k = U = n. Pro G existuje N k koster K, výpočet z Laplaceovy matice/přibližně. Kirchoffův zákon: odstranění j tého řádku/sloupce L L j N k = det(l j ), hodnoty všech subdeterminantů L j stejné. Úplný graf G, zjednodušení (Cayley, 889) N k = n n. Přibližný vztah (Grimmett, 976) N k n ( m ) n = n n Prohledávání všech koster neefektivní, exponenciální růst! ( ) m nk. n k (0, ), n k (0, 0) 876, n k (0, 0) 786880. n k

Kostra grafu 6. Kostry K, n k = b c g a f d e 8 / 6

Kostra grafu 7. Počet koster N k L = 0 0 0 0 0 0 Kirchoffův zákon: Přibližný výpočet: L = L =, L = 0 0 0 0 0 0 0 0 0 0 0 0, L =,, L = 0 0 N k = det(l ) = det(l ) = det(l ) = det(l ) = det(l ) =. ( ) 7.= 0.0. 0 0 0 0. N k 9 / 6

8. Bez ohodnocení grafu mají všechny K stejnou váhu. Předpoklad: G souvislý, neorientovaný, bez záporných hran. Hledáme K = (H k, U, ρ k ) h H k w(h) = min. Úloha není jednoznačná, existence více minimálních koster. Přehled algoritmů: Borůvkův (Kruskalův): O( H log U ). Jarníkův (Primův): O( H log U ). Greedy strategie. Randomizované algoritmy: lineárním čas. 0 / 6

Borůvkův/Kruskalův algoritmus 9. Borůvkův (Kruskalův) algoritmus (/) Objeven prof. Otakarem Borůvkou (899-99) v roce 96. Připojení každé obce na jižní Moravě energetické sítě. Minimalizace nákladů na připojení: délka vedení, počet stožárů. V roce 96 znovu objeven v USA J. P. Kruskalem. Heuristika, v každém okamžiku hledáno lokální minimum. Do kostry přidáváme hranu s minimální vahou spojující podstromy. Pokračujeme, dokud les není stromem. Opakované sjednocování: UNION, podstromy. Strom: souvislý, neobsahuje kružnici. Les: nesouvislý, neobsahuje kružnici, tvořen posdstromy. / 6

0. Borůvkův (Kruskalův) algoritmus / Předzpracování: setřídění hran dle w. Implementace využívá prioritní frontu. Opakované přidávání hrany hs aktuálně nejnižším w, aby nevznikla kružnice. Mohou nastat situace: Žádný uzel h neleží v jiném podstromu Hrana vytvoří nový podstrom. Jeden uzel h součástí některého z podstromů Hranu připojíme k podstromu. Oba uzly h v různých podstromech Oba podstromy spojíme do jednoho. Oba uzly h v jednom podstromu Přidání h vede ke kružnici, zahodíme. Implementace množinových operací nad stromem: MAKE_SET(x): vytvoření nové množiny s jedním prvkem x (identifikátor). FIND_SET(x): vrací identifikátor množiny obsahující prvek x. UNION(x, y): sjednocení podmnožin x, y do jedné podmnožiny.

. Ukázka Borůvkova algoritmu Borůvkův/Kruskalův algoritmus / 6

. Ukázka operace UNION(x, y) Borůvkův/Kruskalův algoritmus # h w(h) Disjunktní podmnožiny 0 - - {} {} {} {} {} {6} {7} {8} {9} (7, 8) {} {} {} {} {} {6} {7, 8} {9} (, ) {, } {} {} {} {6} {7, 8} {9} (, ) {, } {} {, } {6} {7, 8} {9} (6, 7) {, } {} {, } {6, 7, 8} {9} (, 9) {, } {, 9} {, } {6, 7, 8} 6 (, 8) {, } {, 9} {6, 7, 8,, } 7 (, 6) {, } {6, 7, 8,,,, 9} 8 (, ) {6, 7, 8,,,, 9,, } Minimální kostra G: K = {6, 7, 8,,,, 9,, }, w(k ) =. / 6

. Pseudokód B/K algoritmu Borůvkův/Kruskalův algoritmus Na vstupu graf G = (H, U, ρ), ohodnocení w(h). T. for u U : MAKE_SET(u) sort(h,w(h)) for h = (u, v) : #Empty tree #For each node #Create U-F structure #Sort edges by weights if FIND_SET(u)!= FIND_SET(v ): #u,v in different sets T h #Add edge to T UNION(u, v ) #Make union of sets containing u,v Pseudokód jednoduchý, implementace obtížnější. Klíčové faktory: efektivita nalezení hrany h(u, v) v podstromu: FIND_SET(u), efektivní implementace sjednocení u, v: UNION(u, v). Bud umíme rychleji hledat nebo rychleji spojovat. / 6

Borůvkův/Kruskalův algoritmus. Varianty UNION-FIND UNION-FIND = UNION + FIND_SET (viz dále). Datová struktura UNION-FIND: Spojový seznam (Array-based) FIND_SET O(), UNION O(log (n)). Strom (Tree-based) FIND_SET O(log (n)), UNION O(). Nejrychlejší známá implementace. V praxi preferována varianta. Téměř všechny implementace Tree-based. heuristiky: Weighted Union: připojování menšího za větší (AB, TB). Path Compression: zkracování výšky tromu (TB). 6 / 6

. UNION-FIND, AB Linked list uchovává identifikátor, první prvek. UF: linked list, identificators UF: sizes 9 6 6 7 8 6 UF: D array, index 6 6 6 6 7 8 9

Borůvkův/Kruskalův algoritmus 6. UNION-FIND, AB, popis operací MAKE_SET(u): Vytvoření datové reprezenentace: spojový seznam/pole s délkou (+identif.), index. Setřídění, celkově O(m log n). FIND_SET (u). Velmi efektivní díky indexačnímu poli, O(). Celkově O(m). UNION(u, v): Zjištění délky u, v. Za delší připojíme kratší: Weighted Union. Změna identifikátorů pro kratší seznam. Delší seznam neměněn. Složitost O(log n), celkově O(n log n). Celkově: m log n + m + n log n. 8 / 6

Borůvkův/Kruskalův algoritmus 7. Ukázka UNION(,6) UF: linked list, identificators UF: sizes 9 6 6 7 8 6 UF: D array, index 6 6 6 6 6 6 7 8 9 u =, v = : v u. if len(u)<len(v): for i in u: #Process all elements in shorter array index[i] = v size[v] = size[v] + size[u] #Change size #Change index to all x elements 9 / 6

8. Union-Find, TB Borůvkův/Kruskalův algoritmus 6 9 7 Union(,6) 6 7 8 8 Union(,6) 6 Union(,6) 6 7 8 7 8 9 9 0 / 6

Borůvkův/Kruskalův algoritmus 9. Union-Find, TB, datové struktury Každá podmnožina kořenovým stromem: Její prvky odkazují na otce (parent) kořen. Aneb pro každý prvek stromu ukládán parent, který je identifikátorem. Hodnost stromu h (rank): h = log n s, odhad výšky stromu, n s počet uzlu ve stromu, netřeba znát přesně. Path compression: Zkracování cesty (stromu) snižování výšky. Heuristika, dvojprůchodová, rekurzivní implementace. Postup PC:. průchod: nalezení kořene stromu.. průchod: každému prvek na cestě ke kořenu upraven odkaz na rodiče. Tyto prvky připojeny na kořen stromu. / 6

Borůvkův/Kruskalův algoritmus 0. Path compression () 6 6 7 7 8 8. Od () rekurzivně vzhůru, kořen (6).. Přepojení všech uzlů cesty <,7,6> ke kořeni. / 6

Borůvkův/Kruskalův algoritmus. Implementace PC Součást operace FIND_SET. Velmi jednoduchá implementace, rekurze. Volána při operaci UNION: proto nazývána UNION-FIND. Přímý chod: dokud existuje předhůdce, pokračuj do kořene. Zpětný chod: update předchůdců od kořene. def find(u, p): if p[u]!= u: p[u] = find(p[u], p) return p[u] #Node is not root #Find its predecessor #Return root Časová složitost O(log n). / 6

. Union-Find, TB, popis operací MAKE_SET(u): Vytvoření datové reprezenentace: stromy tvořené jedním prvkem. p[u] = u, r[u] = 0. Setřídění, celkově O(m log n) FIND_SET (u). Path Compression, snižujeme výšku stromu, O(log n). Volána při UNIONu. Celkově O(m log n). UNION(u, v): Vyvažování stromu při sjednocení. Kořen menšího stromu připojen na kořen většího dle r: Weighted Union. Pokud jsou stejné, vybereme libovolný z nich. Složitost O(), celkově O(n). Celkově: m log n + m log m + n.

Borůvkův/Kruskalův algoritmus. Operace UNION(u, v) Pro každý uzel u nutno uchovávat informace: parent (rodič) p[u], inicializace p[u] = u, hodnost (rank) podstromu r[u], inicializace r[u] = 0. Pro p, r použity seznamy. Připojujeme -li menší podstrom k většímu, rank většího se nemění, Rank updatován, pokud r[u] = r[v], Postup: r = max(r[u], r[v]). r = r[u] + = r[v] +. Nalezení kořenů R u, R v stromů obsahujících u, v + komprese obou cest. Pokud u, v jiném podstomu, porovnáme hodnosti. a) Jestliže r[u] > r[v], připojíme v k u: p[r v] = R u. b) Jestliže r[v] > r[u], připojíme u za v: p[r u] = R v. c) Při shodě r[u] = r[v]: p[r v] = R u (např.). Update ranku r[u] = r[u] +. / 6

. Union(u, v), update ranku, ukázka r(7) = r() = r() = max(r(7), r()) = 7 8 9 Union(7,): 9 7 6 8 6 r(7) = 7 r() = r() = r() + = r(7) + = 8 9 Union(7,): 9 7 6 8 6

Borůvkův/Kruskalův algoritmus. Implementace UNION(u, v) Tree-based varianta. Kombinace UNION + FIND. Při hledání uzlu prováděna komprese. def union(u, v, p, r): root_u = find(u, p) #Find root for u + compress root_v = find(v, p) #Find root for v + compress if root_u!= root_v: #u, v in different subtrees if r[root_u] > r[root_v]: #u subtree is longer p[root_v] = root_u #Connect v to u elif r[root_v] > r[root_u]: #v subtree is longer p[root_u] = root_v #Connect u to v elif u!= v: #u, v have equal lengths p[root_u] = root_v #Connect u to v r[root_v] = r[root_v]+ #Increment rank 7 / 6

Borůvkův/Kruskalův algoritmus. Datová reprezentace grafu Kombinovaná reprezentace: seznam vrcholů V a hran E. Reprezentace vrcholů: Seznam vrcholů V v G. V = [v, v,...,vk] Reprentace hran: Hrana: uspořádaná trojice - počáteční uzel u, koncový uzel v, ohodnocení w. Hrany: spojová reprezentace, seznam hran E. E = [ [u, v, w], [u, v, w],... [uk, vk, wk], ] Hrany lze snadno setřídit dle w. Dříve používané reprezentace umožňují snadnou konverzi na smíšenou. 8 / 6

6. Ukázka reprezentace grafu Borůvkův/Kruskalův algoritmus 8 6 7 7 6 7 8 0 9 Reprezentace uzlů: V = [,,,,, 6, 7, 8, 9] Reprezentace hran: E = [[,, 8], [,, ], [,, ], [, 8, 7], [,, 8], [,, ], [,, ], [, 7, 6], [,, ], [,, ], [, 6, ], [, 7, ], [, 9, ], [,, ], [,, ], [, 6, ], [6, 8, 7], [6, 9, 0], [6,, ], [6,, ], [6, 7, ], [7, 8, ], [7,, 6], [7,, ], [7, 6, ], [8, 9, ], [8,, 7], [8, 6, 7], [8, 7, ], [9, 8, ], [9,, ], [9, 6, 0]] 9 / 6

Borůvkův/Kruskalův algoritmus 7. Implementace Borůvkova-Kruskalova algoritmu def mstk(v, E): T=[] #Empty tree wt = 0 #Sum of weights of T p = [inf] * (len(v) + ) #List of predeccessors r = [inf] * (len(e) + ) #Rank of the node for v in V: #Make set make_set(v, p, r) ES = sorted(e, key=lambda it:it[]) #Sort edges by w for e in ES: #Process all edges u, v, w = e #Take an edge if (find(u, p)!= find(v, p)): #u, v in different trees? union(u, v, p, r) #Create union T.append([u, v, w]) #Add edge to tree wt = wt + w #Compute weight of T return wt, T 0 / 6

8. Výsledky, ukázka Borůvkův/Kruskalův algoritmus 6 8 6 7 7 7 8 0 9 wt, T = mst(v,e) print(t) >> [[8, 9, ], [,, ], [,, ], [, 6, ], [, 9, ], [7, 8, ], [,, ], [, 7, ]] print(wt) >> / 6

7. Jarníkův (Primův algoritmus) Objeven prof. Vojtěchem Jarníkem (897-970) v roce 90. Prof. Jarník působil v letech 9- na PřF UK. Znovu objeven: 97, R. C. Prime, 99 E. W. Dijkstra. Borůvkův algoritmus pracuje současně s více podstromy, které sjednocuje. Jarníkův algoritmus pracuje pouze s jedním podstromem, který rozšiřuje. Využívá Greedy strategii. Velmi podobný Dijkstra, liší se způsobem relaxace. K aktuálnímu uzlu u hledáme v minimalizující d[v] = w(u, v). Vrcholy možno značkovat. Implementačně jednodušší než Borůvkův/Kruskalův. Klíčový prvkem rychlost hledání v prioritní frontě Q. Při implementaci Q haldou O(n), pomalé, nutno značkovat O().

Jarníkův/Primův algoritmus 8. Popis Jarníkova/Primova algoritmu Uzly, které nejsou v podstromu, uloženy v prioritní frontě Q setříděné dle d[v]. Pokud nelze v Q hledat O(n), nutno značkovat O(). Při inicializaci všem u U nastaveny d[u] =. Lze začít od libovolného uzlu. Jeden označen jako root r, d[r] = 0, zpravidla r = 0. Dokud Q není prázdná vyjmeme uzel (d[u], u). Pro každé dosud nenavštívené v incidující s u relaxace d[v] > w[u][v] d[v] = w[u][v], p[v] = u. Hodnota d[v] neobsahuje celkovou délku cesty s u (Dijkstra). Reprentuje vzdálenost od kostry d[v] = w(u, v). Pro uzel v uložíme předchůdce p[v]. Následně přidáme (d[v], v) do Q: Rekonstrukce kostry: nalezneme p[u] pro všechna u U. / 6

Jarníkův/Primův algoritmus 9. Ukázka Jarníkova/Primova algoritmu 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 0 8 6 7 0 7 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK.) Grafové algoritmy III. / 6

Jarníkův/Primův algoritmus 0. Implementace Jarníkova/Primova algoritmu Reprezentace G spojovým seznamem. Ukázka: def mstj(g, r): s = ['N'] * (len(g) + ) #No vertex is in mst d = [float('inf')] * (len(g) + ) #Set infinite distances p = [-] * (len(g) + ) #No predecessors Q = queue.priorityqueue() #Priority queue d[r] = 0 #Root d[r] = 0 Q.put((0, r)) #Add start vertex while not Q.empty(): du, u = Q.get() #Pop first element s[u] = 'C' #Node belongs to mst, close for v, dv in G[u].items(): if s[v] == 'N': #Relaxation, v not in mst if d[v] > dv: #We found a better node d[v] = dv #Update distance from mst p[v] = u #Update predecessor Q.put((d[v], v)) #Add to Q mstj(g,) >> [-,,, 9,,,, 7, 8] / 6

. Výsledky, ukázka Jarníkův/Primův algoritmus 6 8 6 7 7 7 8 0 9 6 / 6