120 likes | 571 Views
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. 8. 7. 4. 9. 2. 14. 11. 7. 4. 6. 10. 8. 1. 2. Minimalne drzewa rozpinające.
E N D
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
8 7 4 9 2 14 11 7 4 6 10 8 1 2 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. Przykład minimalnego drzewa rozpinającego
Algorytm Kruskala MST-Kruskal(G, w) 1 A := 2 for każdy wierzchołek vV[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 doif Find-Set(u) Find-Set(v) 7 then A := A {(u,v)} 8 Union(u,v) 9 return A
8 7 8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 8 7 8 7 4 9 4 9 2 14 2 11 11 7 4 7 4 6 6 10 10 8 8 1 2 8 7 8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 Algorytm Kruskala (przykład) 1 2
Algorytm Prima MST-Prim(G, w, r) 1 Q := V[G] 2 for każdy uQ 3 dokey[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 vQ i w(u,v) < key[v] 10 then [v] := u 11 key[v] := w(u,v)
8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 8 7 8 7 4 9 4 9 2 14 2 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 Algorytm Prima (przykład) 8 7 8 7 1 2
6 6 3 9 3 3 9 3 4 4 1 s 1 2 s 0 2 0 2 2 7 3 7 3 5 5 5 11 5 11 6 6 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 v. Wagą ścieżki jest suma wag tworzących ją krawędzi. Najkrótszą ścieżką jest ścieżka o najmniejszej wadze. Ważony graf skierowany 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 vV[G] 2 dod[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 ifd[v] > d[u] + w(u, v) 2 thend[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)
1 1 10 1 10 8 14 10 9 8 9 3 s 2 0 9 4 9 3 2 6 7 3 0 s 2 4 0 4 6 7 5 6 7 5 5 2 7 5 5 7 2 2 1 1 10 10 10 8 8 10 13 9 9 9 9 3 3 3 s 2 2 2 0 0 0 4 4 4 6 6 6 7 7 7 5 5 5 5 5 5 7 7 2 2 2 Algorytm Dijkstry (przykład) s 1 s s
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) 5for każda krawędź (u, v) E[G] 6 do ifd[v] > d[u] + w(u, v) 7 then return FALSE 8 return TRUE
5 5 5 6 6 4 4 6 2 6 -2 -2 3 3 -3 -3 s s -2 8 8 0 0 3 -3 s 8 0 -4 -4 7 7 -4 7 2 2 7 7 7 7 2 2 -2 7 9 9 5 5 6 6 4 6 2 -2 -2 3 3 -3 -3 s s 8 8 0 0 -4 -4 7 7 2 2 7 7 7 7 2 9 Algorytm Bellmana-Forda (przykład) 9