Øvingsforelesning 4 Topologisk sortering, Strongly Connected Components og Minimale spenntrær Magnus Botnan botnan@stud.ntnu.no 09/10/09 1
I dag Topologisk Sortering Sterke Komponenter Minimale Spenntrær Gjennomgang av Teori- og Praksisøving Gjennomgang av NWERC(Northwestern European Programming Contest)-oppgave relatert til Sterke Komponenter(avansert) 09/10/09 2
Topologisk sortering Minimale spenntrær Hvilke av følgende grafer er en DAG? 1 2 3 09/10/09 3
Directed Acyclic Graph (DAG) En DAG er en rettet, asyklisk graf Alle trær er DAG s fordi de ikke har kanter som går bakover i arveretningen. Uten bakoverkanter får man ingen sykler. Det er likevel ikke gitt at alle DAG s er trær 09/10/09 4
Topologisk sortering Minimale spenntrær 3 1 2 < < < < < < < 09/10/09 5
Topologisk sortering Minimale spenntrær Problemstilling: Finn en ordning av alle noder i en DAG slik at alle noder som er foreldre-noder listes opp før sine etterkommere. Algoritme: Kjør DFS på alle noder og legg dem først i en liste etter hvert som de fullføres. PS! DFS på en vilkårlig graf uten sykler starter på en vilkårlig node som ikke er besøkt. Dette gjøres om igjen helt til alle noder er besøkt. 09/10/09 6
Topologisk sortering Minimale spenntrær Algoritme: Kjør DFS på alle noder og legg dem først i en liste etter hvert som de fullføres. DFS på graf 1: 1 1: [e] a 2: [d, e] 3: [b, d, e] 4: [c, b, d, e] b c 5: [a, c, b, d, e] d e Asymptotisk kjøretid: For hver node, sjekk alle kantene fra noden. Θ(V + E) 09/10/09 7
Minimale spenntrær Strongly Connected Component (SCC): En maksimal del av en graf (subgraf) hvor alle noder kan nå alle. En SCC er nødvendig vis en sykel, men en sykel er ikke en SCC hvis den ikke er maksimal. Definisjon: SCC av en graf G = (V,E) er en maksimal mengde av alle hjørner C E slik at for hvert par av hjørner u, v C har vi både stien u v og v u 09/10/09 8
Minimale spenntrær 09/10/09 9
Minimale spenntrær Problemstilling: Finn alle SCC s i en graf G Algoritme: Kjør DFS på G for å finne alle endetider. Kjør DFS på G T men velg utgangsnoder med synkende endetid. Resulterende dybde først skog består av et tre for hver SCC. 09/10/09 10
Minimale spenntrær Algoritme: Kjør DFS på G for å finne alle endetider. Kjør DFS på G T men velg utgangsnoder med synkende endetid. Resulterende dybde først skog består av et tre for hver SCC. a b c d 13/ 14 11/ 16 1/ 10 8/ 9 12/ 15 3/ 4 2/ 7 5/ 6 e f g h 09/10/09 11 (s. 553 i Cormen)
Minimale spenntrær Algoritme: Kjør DFS på G for å finne alle endetider. Kjør DFS på G T men velg utgangsnoder med synkende endetid. Resulterende dybde først skog består av et tre for hver SCC. a b c d 14 16 10 9 15 4 7 6 e f g h 09/10/09 12
Forklaring (uformelt bevis) 1. Vi antar at alle tidligere besøkte noder er deler av komplette SCC s 2. For hver nye rot vi velger til vår baklengs DFS er alle andre noder en av følgende: Besøkt ( og derfor antatt deler av SCC s ) Lavere finish-tid Lavere finish-tid + umulig å nå i vårt baklengs DFS-tre 1. Anta at det finnes en node med lavere finish-tid, som vi når i baklengs dfs, som ikke er med i SCC. Da kan den ikke nås via forlengs dfs, og per antakelse må den ha blitt kjørt tidligere. Men hvis den har blitt kjørt før vil den ha senere timestamp enn roten vi kjører fra nå. Motsigelse. 09/10/09 13
Minimale spenntrær Algoritme: Kjør DFS på G for å finne alle endetider. Kjør DFS på G T men velg utgangsnoder med synkende endetid. Resulterende dybde først skog består av et tre for hver SCC. K+2 F > K F K K+1 K+3 K K-1 K -1 K -1 K -1 K -1 K -1 K-2 09/10/09 14
Minimale spenntrær Et spenntre i en graf er et utvalg av grafens kanter, som danner et tre som dekker alle nodene. ( Som vanlig for trær blir antall kanter n-1 ) I vektede grafer kan vi ha minimale spenntrær. Dette er de spenntrærne som benytter et utvalg av kanter som totalt sett har den minste mulige vekten. 09/10/09 15
Minimale spenntrær Problemstilling: Finn et minimalt spenntre Generisk algoritme: Så lenge det finnes en kant som garantert er en del av et slikt tre, bruk denne og let videre blant de resterende kantene Generic-MST (Cormen) Generic-MST(G,w) A while A does not form a spanning tree find an edge (u, v) that is safe for A A A {(u, v)} return A 09/10/09 16
Minimale spenntrær Prims algoritme: Velg en vilkårlig node. Opprett en liste over naboer. Så lenge det finnes ubesøkte naboer: Velg den billigste og fjern denne fra lista. Legg til nodens hittil ubesøkte naboer. 09/10/09 17
Minimale spenntrær Prims algoritme: Binary Heap O(E*log(V)). Nabomatrise O(V 2 ) Fibonnaci Heap O(E + V*log(V)) 09/10/09 18
Minimale spenntrær 09/10/09 19
Minimale spenntrær Kruskals algoritme Velg en ny kant, alltid den billigste. Sjekk at kanten ikke danner en sykel. (Dette kan gjennomføres ved å passe på at nodene befinner seg i forskjellige trær) 09/10/09 20
Minimale spenntrær 09/10/09 21