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.

Download Report

Transcript 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.

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
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.
8
7
4
9
2
11
7
14
6
4
10
8
1
2
Przykład minimalnego drzewa rozpinającego
Algorytm Kruskala
MST-Kruskal(G, w)
1 A := 
2 for każdy wierzchołek vV[G]
3
do Make-Set(v)
4 posortuj krawędzie z E niemalejąco względem wag w
5 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)
9 return A
Algorytm Kruskala (przykład)
8
4
11
7
2
7
8
6
4
7
6
8
4
2
7
4
2
4
2
7
7
6
7
2
7
9
14
6
1
10
2
8
8
9
4
1
4
10
2
8
11
10
6
8
14
6
1
9
9
14
1
11
10
7
7
4
2
8
11
9
7
2
8
14
1
4
10
7
2
8
11
2
8
11
8
4
14
1
4
9
4
2
10
Algorytm Prima
MST-Prim(G, w, r)
1 Q := V[G]
2 for każdy uQ
3
do key[u] := 
4 key[r] := 0
5  [r] := NIL
6 while Q  
7
do u := Extract-Min(Q)
8
for każdy v  Adj[u]
9
do if vQ i w(u,v) < key[v]
10
then  [v] := u
11
key[v] := w(u,v)
Algorytm Prima (przykład)
8
4
11
7
2
7
8
6
4
7
6
8
4
2
7
4
2
4
2
7
7
6
7
2
7
9
14
6
1
10
2
8
8
9
4
1
4
10
2
8
11
10
6
8
14
6
1
9
9
14
1
11
10
7
7
4
2
8
11
9
7
2
8
14
1
4
10
7
2
8
11
2
8
11
8
4
14
1
4
9
4
2
10
Najkrótsze ścieżki z jednym
źródłem
Dany jest ważony graf skierowany G=(V,E) i wyróżniony
wierzchołek sV, nazywany źródłem; dla każdego
wierzchołka vV należy znaleźć najkrótszą ścieżkę z s do v.
Wagą ścieżki jest suma wag tworzących ją krawędzi.
Najkrótszą ścieżką jest ścieżka o najmniejszej wadze.
6
6
3
s
1
2
0
4
s
3
5
3
9
3
5
2
1
2
0
9
3
4
3
7
11
6
Ważony graf skierowany
5
5
2
7
11
6
Drzewo najkrótszych ścieżek
Najkrótsze ścieżki z jednym
źródłem
d[v] - oszacowanie wagi najkrótszej ścieżki, [v] - poprzednik v
Initialize-Single-Source(G, s)
1 for każdy wierzchołek vV[G]
2
do d[v] := 
3
[v] := NIL
4 d[s] := 0
Relaksacja krawędzi - ewentualne zmniejszenie oszacowania wagi
najkrótszej ścieżki d[v]
Relax(u, v, w)
1 if d[v] > d[u] + w(u, v)
2
then d[v] := d[u] + w(u, v)
3
[v] := u
Algorytm Dijkstry
Dijkstra(G, w, s)
1 Initialize-Single-Source(G, s)
2 S := 
3 Q := V[G]
4 while Q  
5
do u := Extract-Min(Q)
6
S := S  {u}
7
for każdy wierzchołek v  Adj[u]
8
do Relax(u, v, w)
Algorytm Dijkstry (przykład)
1
1
s
3
2
0
9
s
7
10
s
3
7
5
1
1
s
4
2
5
5
10
s
4
6
7
8
3
2
0
9
9
6
7
2
4
1
7
5
9
7
5
9
6

5
0
9
3
2
0
13
3
8
2
8
2
6
7
2
9
s
4
5
10
10
9
2
7
5
14
6

3
1
8
2
0

10
2
0
4

5
10


10
7
5
5
4
6
7
2
Algorytm Bellmana-Forda
Bellman-Ford(G, w, s)
1 Initialize-Single-Source(G, s)
2 for i = 1 to |V[G]| - 1
3
do for każda krawędź (u, v)  E[G]
4
do Relax(u, v, w)
5 for każda krawędź (u, v)  E[G]
6
do if d[v] > d[u] + w(u, v)
7
then return FALSE
8 return TRUE
Algorytm Bellmana-Forda
(przykład)
5
5
s
0

7
-2
3
8
6


6
2
s
-3
-4

-2
3
7
7
7

-2
3
7
2
-3
-4
6
s
7

9
7
7
-2
3
8
0
4
2
7
2
-3
-4
7
2
9
4
2
-2
3
8
0
7
2
5
6
8
0
s
9
5
s
-3
-4
2
7
9
6
6
4
6
8
0
5
7
2
-3
-4
7
-2