Minimale-kost opspannende bomen - caagt
Minimale-kost opspannende bomen - caagt
Minimale-kost opspannende bomen - caagt
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Opspannende <strong>bomen</strong><br />
minimale-<strong>kost</strong> <strong>opspannende</strong> <strong>bomen</strong><br />
breedte-eerst doorlopen<br />
diepte-eerst doorlopen<br />
toepassingen<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.1/22
<strong>Minimale</strong>-<strong>kost</strong><br />
<strong>opspannende</strong> <strong>bomen</strong><br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.2/22
Wegennetwerk aanleggen<br />
Probleemstelling<br />
gegeven: n steden<br />
voor elk paar steden Si en Sj: <strong>kost</strong> om<br />
rechtstreekse weg tussen Si en Sj aan te<br />
leggen<br />
definitie: A bereikbaar uit B als<br />
ofwel A en B rechtstreeks verbonden,<br />
ofwel bestaan er tussenliggende steden<br />
X1,...Xk, zodat A–X1, X1–X2, . . . , Xk–B<br />
rechtstreekse verbindingen zijn<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.3/22
Wegennetwerk aanleggen<br />
Probleemstelling (vervolg)<br />
gevraagd: aanleggen wegennetwerk, zo dat:<br />
elke stad bereikbaar uit elke andere stad<br />
zo goedkoop mogelijk<br />
Grafentheoretisch probleem<br />
minimale-<strong>kost</strong> <strong>opspannende</strong> boom (MST)<br />
Gekende algoritmen: Kruskal / Prim<br />
gretige algoritmen die optimale oplossing<br />
geven<br />
correctheid te bewijzen<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.4/22
<strong>Minimale</strong>-<strong>kost</strong> <strong>opspannende</strong> boom<br />
Algoritme van Kruskal<br />
telkens kleinste boog toevoegen, op<br />
voorwaarde dat nog steeds acyclisch<br />
Algoritme van Prim<br />
voorlopige boom telkens uitbreiden met<br />
kleinste boog die top uit boom verbindt met<br />
top buiten boom<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.5/22
Algoritme van Kruskal<br />
Input: gewogen graaf G = (V,E) met n toppen<br />
en m bogen<br />
Output: bogenverzameling ET van MST T<br />
van G<br />
1: sorteer E zo dat w(ei1 ) ≤ · · · ≤ w(eim )<br />
2: ET ← ∅<br />
3: k ← 0<br />
4: while |ET | < n − 1 do<br />
5: k ← k + 1<br />
6: if 〈ET ∪ {eik }〉 is acyclisch then<br />
7: ET ← ET ∪ {eik }<br />
8: return ET<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.6/22
Algoritme van Kruskal<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Kruskal levert minimale-<strong>kost</strong><br />
<strong>opspannende</strong> boom voor samenhangende<br />
gewogen graaf<br />
Efficiënte implementatie<br />
hoe controleren dat toevoegen van boog een<br />
cykel zou vormen?<br />
Complexiteit<br />
totale <strong>kost</strong> Θ(m log n + n 2 )<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.7/22
Algoritme van Prim<br />
Input: gewogen graaf G = (V,E) met n toppen<br />
en m bogen<br />
Output: bogenverzameling ET van MST T<br />
van G<br />
1: zij x0 willekeurige top van G<br />
2: VT ← {x0}; ET ← ∅<br />
3: while |ET | < n − 1 do<br />
4: zij e ′ = x ′ y ′ een boog zo dat w(e ′ ) =<br />
min{w(e) | e = xy,x ∈ VT,y ∈ V \ VT }<br />
5: VT ← VT ∪ {y ′ }<br />
6: ET ← ET ∪ {e ′ }<br />
7: return ET<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.8/22
Algoritme van Prim<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Prim levert minimale-<strong>kost</strong><br />
<strong>opspannende</strong> boom voor samenhangende<br />
gewogen graaf<br />
Complexiteit van eenvoudige implementatie<br />
<strong>kost</strong> Θ(nm)<br />
Efficiënte implementatie<br />
gebruikt prioriteitswachtlijn<br />
<strong>kost</strong> reduceren tot Θ(m log n)<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.9/22
Breedte-eerst doorlopen<br />
van een graaf<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.10/22
Breedte-eerst doorlopen van graaf<br />
Algemene ideeën<br />
gegeven: graaf G = (V,E), starttop v ∈ V<br />
alle toppen systematisch doorlopen door<br />
steeds zo breed mogelijk verder te gaan<br />
Implementatie<br />
maakt gebruik van wachtlijn<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.11/22
Pseudocode BFS<br />
Input: graaf G = (V,E)<br />
Output: labels ℓ voor G; breedte-eerst-woud<br />
met bogenverzameling B; rij P met voor elke<br />
top zijn ouder in woud<br />
1: ℓ(v) ← 0, ∀v ∈ V<br />
2: i ← 0; B ← ∅; Q ← lege wachtlijn<br />
3: for all v ∈ V do<br />
4: if ℓ(v) = 0 then<br />
5: doe verwerking van v<br />
6: return ℓ, B, P<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.12/22
Pseudocode BFS (2)<br />
Verwerking van v<br />
1: i ← i + 1; ℓ(v) ← i<br />
2: enqueue v op Q<br />
3: while Q is niet leeg do<br />
4: dequeue w van Q<br />
5: for all x ∈ V : x ∼ w en ℓ(x) = 0 do<br />
6: i ← i + 1; ℓ(x) ← i<br />
7: B ← B ∪ {wx}; P[x] ← w<br />
8: enqueue x op Q<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.13/22
Complexiteit van BFS<br />
Merk op: voorstellen van grafen<br />
adjacentiematrixvoorstelling<br />
adjacentielijstvoorstelling<br />
Complexiteit BFS<br />
elke boog wordt hoogstens tweemaal<br />
bekeken door algoritme<br />
onderstel adjacentielijstvoorstelling<br />
totale complexiteit is Θ(n + m)<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.14/22
Diepte-eerst doorlopen<br />
van een graaf<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.15/22
Diepte-eerst doorlopen van graaf<br />
Algemene ideeën<br />
gegeven: graaf G = (V,E), starttop v ∈ V<br />
alle toppen systematisch doorlopen door<br />
steeds zo diep mogelijk verder te gaan<br />
bij een doodlopende top wordt op de stappen<br />
teruggekeerd<br />
Merk op<br />
cfr. backtracking<br />
gemakkelijk recursief te implementeren<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.16/22
Pseudocode DFS<br />
Recursieve implementatie<br />
Input: graaf G = (V,E)<br />
Output: labeling dfi(v) voor toppen v ∈ V met<br />
diepte-eerst-indices<br />
1: for all v ∈ V do<br />
2: dfi(v) ← 0 (“onbezocht”)<br />
3: i ← 0<br />
4: for all v ∈ V do<br />
5: if dfi(v) = 0 then<br />
6: DFS(v)<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.17/22
Pseudocode DFS (2)<br />
Recursieve hulpmethode DFS(v)<br />
Merk op<br />
1: i ← i + 1<br />
2: dfi(v) ← i<br />
3: for all w ∈ V adjacent met v do<br />
4: if dfi(w) = 0 then<br />
5: DFS(w)<br />
recursieve implementatie van DFS is<br />
gemakkelijk om te zetten naar niet-recursieve<br />
versie<br />
maakt gebruik van stapel<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.18/22
Pseudocode DFS (3)<br />
Niet-recursieve implementatie<br />
Input: graaf G = (V,E)<br />
Output: diepte-eerst-indices dfi voor G;<br />
diepte-eerst-woud met bogenverzameling B;<br />
rij P met voor elke top zijn ouder in woud<br />
1: dfi(v) ← 0, ∀v ∈ V<br />
2: ℓ ← 0; B ← ∅; S ← lege stapel<br />
3: for all v ∈ V do<br />
4: if dfi(v) = 0 then<br />
5: doe niet-recursieve DFS vanaf v<br />
6: return dfi, B, P<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.19/22
Pseudocode DFS (4)<br />
Niet-recursief DFS-doorlopen vanaf v<br />
1: ℓ ← ℓ + 1; dfi(v) ← ℓ<br />
2: push v op S<br />
3: while S is niet leeg do<br />
4: peek w van S<br />
5: if ∃x ∈ V : x ∼ w en dfi(x) = 0 then<br />
6: ℓ ← ℓ + 1; dfi(x) ← ℓ<br />
7: B ← B ∪ {wx}; P[x] ← w<br />
8: push x op S<br />
9: else<br />
10: pop w van S<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.20/22
Complexiteit van DFS<br />
Merk op: voorstellen van grafen<br />
adjacentiematrixvoorstelling<br />
adjacentielijstvoorstelling<br />
Complexiteit DFS<br />
elke boog wordt hoogstens tweemaal<br />
bekeken door algoritme<br />
onderstel adjacentielijstvoorstelling<br />
totale complexiteit is Θ(n + m)<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.21/22
Toepassingen van DFS en BFS<br />
Zowel DFS als BFS<br />
bepalen of graaf samenhangend is<br />
bepalen of graaf acyclisch is<br />
bepalen of graaf bipartiet is<br />
Typisch BFS<br />
kortste pad in ongewogen graaf van starttop v<br />
naar alle andere toppen<br />
Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.22/22