background image

 

 

Algorytmy grafowe

•Minimalne drzewa rozpinające

•Algorytm Kruskala
•Algorytm Prima

•Wyszukiwanie najkrótszych ścieżek z 

jednym źródłem

•Algorytm Dijkstry
•Algorytm Bellmana-Forda

background image

 

 

Minimalne drzewa 

rozpinające

Podgraf T spójnego grafu G nazywa się jego 
drzewem rozpinającym, jeśli T jest acykliczny i 
łączy wszystkie wierzchołki G. Jeśli krawędziom 
przypisane są wagi, i suma wag krawędzi T jest 
minimalna, T nazywamy minimalnym drzewem 
rozpinającym.

4

8

7

9

14

10

2

1

11

2

7

8

4

6

Przykład minimalnego drzewa 
rozpinającego

background image

 

 

Algorytm Kruskala

MST-Kruskal(Gw)
A := 
for każdy wierzchołek vV[G]
3

do Make-Set(v)

4 posortuj krawędzie z niemalejąco względem wag w
for każda krawędź (u,v)  E, w kolejności niemalejących 

wag

6

do if Find-Set(u)  Find-Set(v)

7

then A := A  {(u,v)}

8

Union(u,v)

return A

background image

 

 

Algorytm Kruskala 

(przykład)

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

2

1

4

8

7

9

10

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

background image

 

 

Algorytm Prima

MST-Prim(Gw, r)
Q := V[G]
for każdy uQ
3

do key[u] := 

4  key[r] := 0 
5

 [r] := NIL

while Q  
7

do u := Extract-Min(Q)

8

for każdy  Adj[u]

9

do if vQ i w(u,v) < key[v]

10

then 

 [v] := u

11

      key[v] := w(u,v)

background image

 

 

Algorytm Prima (przykład)

8

7

4

9

14

10

2

1

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

4

8

7

9

14

10

2

1

1
1

2

7

8

4

6

2

1

4

8

7

9

10

1
1

2

7

8

4

6

8

7

2

1

4

9

14

10

1
1

2

7

8

4

6

background image

 

 

Najkrótsze ścieżki z 

jednym źródłem

Dany jest ważony graf skierowany G=(V,E) i 
wyróżniony wierzchołek sV, nazywany źródłem

dla każdego wierzchołka vV należy znaleźć 

najkrótszą ścieżkę z s do vWagą ścieżki jest 
suma wag tworzących ją krawędzi. Najkrótszą 
ścieżką
 jest ścieżka o najmniejszej wadze. 

s

6

3

5

7

11

9

3

5

0

2

1

6

2

4

3

Ważony graf skierowany Drzewo najkrótszych ścieżek

s

6

3

5

7

9

3

5

0

2

1

6

2

4

3

1
1

background image

 

 

Najkrótsze ścieżki z 

jednym źródłem

d[v] - oszacowanie wagi najkrótszej ścieżki, [v] - 

poprzednik v

Initialize-Single-Source(Gs
for każdy wierzchołek vV[G]

2

do d[v] := 

3

     [v] := NIL

d[s] := 0

Relaksacja krawędzi - ewentualne zmniejszenie 

oszacowania wagi najkrótszej ścieżki d[v]

Relax(u, v, w)
if d[v] > d[u] + w(uv)
2

then d[v] := d[u] + w(uv)

3

         [v] := u

background image

 

 

Algorytm Dijkstry

Dijkstra(Gw, s)
1 Initialize-Single-Source(Gs)
S := 
Q := V[G] 
while Q  
5

do u := Extract-Min(Q)

6

     S := S  {u}

7

     for każdy wierzchołek v  Adj[u]

8

do Relax(uvw)

background image

 

 

Algorytm Dijkstry 

(przykład)

s

1

1
0

5

6

0

2

3

2

4

9

7

s

1

1
0

5

6

10

5

0

2

3

2

4

9

7

s

1

1
0

5

6

7

14

8

5

0

2

3

2

4

9

7

s

1

1
0

5

6

7

13

8

5

0

2

3

2

4

9

7

s

1

1
0

5

6

7

9

8

5

0

2

3

2

4

9

7

1

s

1
0

5

6

7

9

8

5

0

2

3

2

4

9

7

background image

 

 

Algorytm Bellmana-Forda

Bellman-Ford(Gw, s)
1 Initialize-Single-Source(Gs)
for i = 1 to |V[G]| - 1
3

do for każda krawędź (uv)  E[G]

4

 do Relax(uvw)

 for każda krawędź (uv)  E[G]
6

do if d[v] > d[u] + w(uv)       

7

     then return FALSE

8  return TRUE

background image

 

 

Algorytm Bellmana-Forda 

(przykład)

s

5

6

7

7

0

8

3

9

-4

-2

2

-3

s

5

6

7

7

6

7

0

8

3

9

-4

-2

2

-3

s

5

6

7

7

2

4

6

7

0

8

3

9

-4

-2

2

-3

9

s

5

6

7

7

2

4

2

7

0

8

3

-4

-2

2

-3

s

5

6

7

7

-2

4

2

7

0

8

3

-4

-2

2

-3


Document Outline