03.07.2013 Views

Minimale-kost opspannende bomen - caagt

Minimale-kost opspannende bomen - caagt

Minimale-kost opspannende bomen - caagt

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!