Algorytmy grafowe •Reprezentacja w pamięci •Przeszukiwanie grafów wszerz i w głąb •Sortowanie topologiczne •Silnie spójne składowe •Minimalne drzewa rozpinające •Najkrótsze ścieżki z jednym źródłem.

Download Report

Transcript Algorytmy grafowe •Reprezentacja w pamięci •Przeszukiwanie grafów wszerz i w głąb •Sortowanie topologiczne •Silnie spójne składowe •Minimalne drzewa rozpinające •Najkrótsze ścieżki z jednym źródłem.

Algorytmy grafowe
•Reprezentacja w pamięci
•Przeszukiwanie grafów wszerz i w głąb
•Sortowanie topologiczne
•Silnie spójne składowe
•Minimalne drzewa rozpinające
•Najkrótsze ścieżki z jednym źródłem
Grafy. Definicje.
Graf skierowany G jest parą (V, E), gdzie V jest skończonym
zbiorem wierzchołków, E jest relacją binarną w V,
nazywaną zbiorem krawędzi.
W grafie nieskierowanym G = (V, E) zbiór krawędzi E to
zbiór nieuporządkowanych par wierzchołków.
Graf skierowany
Graf nieskierowany
Reprezentacja w pamięci
grafów nieskierowanych
1
4
1
2
5
2
1
3
3
2
6
4
2
5
1
6
6
3
5
2
3
5
6
1 2 3 4 5 6
4
1
0 1 0 0 1 0
2
1 0 1 1 0 0
0 1 0 0 0 1
3
5
0 1 0 0 0 0
1 0 0 0 0 1
6
0 0 1 0 1 0
4
a) Listy sąsiedztwa grafu
b) Macierz sąsiedztwa grafu
Reprezentacja w pamięci
grafów skierowanych
1
4
2
3
5
6
1 2 3 4 5 6
1
2
5
2
3
3
6
4
2
4
5
6
5
0 1 0 0 0 0
0 0 0 0 0 1
6
0 0 0 0 0 0
1
0 1 0 0 1 0
2
0 0 1 0 0 0
0 0 0 0 0 1
3
6
a) Listy sąsiedztwa grafu
b) Macierz sąsiedztwa grafu
Przeszukiwanie wszerz
BFS(G, s)
1 for każdy wierzchołek uV[G]-{s}
2
do color[u] := BIAŁY
3
d[u] := 
4
[u] := NIL
5 color[s] := SZARY
6 d[s] := 0
7 [s] := NIL
8 Q := {s}
9 while Q  
10
11
12
13
14
15
16
17
18
do u := head[Q]
for każdy vAdj[u]
do if color[v] = BIAŁY
then color[v] := SZARY
d[v] := d[u] + 1
[v] := u
ENQUEUE(Q, v)
DEQUEUE(Q)
color[u] := CZARNY
Przykład przeszukiwania wszerz
1
0
4

Q
2
3



5

1
0
6
2
Q
0
0
4
2
3
1

5

Q
1
2
5
1
1

1
2
1
5
3
4
1
2
2
1
0
6
3
5
4
1
1
2
4

2
3
1
2
Q
2
1
3
4
6
2
2
2
0
6
2
3
1
2
4
6
2
2
0
4
6
2
1
1
6
2
5
4
Q
5
2
1
2
3
1
2
5
1
2
Q
6
2
2
6
Przeszukiwanie w głąb
DFS(G)
DFS-Visit(u)
1 for każdy wierzchołek uV[G]
2
do color[u] := BIAŁY
3
[u] := NIL
4 time := 0
5 for każdy wierzchołek uV[G]
6
do if color[u] = BIAŁY
7
then DFS-Visit(u)
1 color[u] := SZARY
2 d[u] := time := time + 1
3 for każdy vAdj[u]
4 do if color[v] = BIAŁY
5
then [v] := u
6
DFS-Visit(v)
7
color[u] := CZARNY
8
f[u] := time := time + 1
Przykład przeszukiwania w głąb
1
2
1/
3
1
1/
2/
4
2
6
5
2/
4
3
1
2
3
3/6
1/10
2/7
3/6
6
5
4
4/5
1
2
1/
4
3
2/
1
3/
1/
6
5
4/
6
5
8/9
4/5
2
3
1
2
3
2/7
3/6
1/10
2/7
3/6
4
6
5
8/
4/5
4
6
5
11/12
8/9
4/5
Sortowanie topologiczne
Sortowanie topologiczne acyklicznego grafu skierowanego G = (V, E)
polega na uporządkowaniu wszystkich jego wierzchołków w taki sposób,
że jeśli graf G zawiera krawędź (u, v), to w tym porządku wierzchołek u
występuje przed wierzchołkiem v.
Topological-Sort (G)
1 wykonaj DFS(G) w celu obliczenia czasów przetworzenia f[v] dla
wszystkich wierzchołków v.
2 wstaw każdy wierzchołek v na początek listy, kiedy tylko zostanie
przetworzony.
3 return lista wierzchołków
Przykład sortowania
topologicznego
1
2
3
1/10
2/7
3/6
4
6
5
11/12
8/9
4
1
5
11/12
1/10
8/9
4/5
2
3
6
2/7
3/6
4/5
Silnie spójne składowe
Silnie spójną składową skierowanego grafu G = (V, E) jest maksymalny
zbiór wierzchołków U  V taki, że dla każdej pary wierzchołków u i
v z U wierzchołki u i v są osiągalne jeden z drugiego.
Strongly-Connected-Components (G)
1 wykonaj DFS(G) w celu obliczenia czasów przetworzenia f[u] dla
wszystkich wierzchołków u.
2 oblicz GT
3 wykonaj DFS(GT), ale w głównej pętli procedury DFS rozważaj
wierzchołki w kolejności malejących wartości f[u] (obliczonych w
wierszu 1)
4 wypisz wierzchołki z każdego drzewa w lesie przeszukiwania w głąb
z kroku 3 jako oddzielną silnie spójną składową
Silnie spójne składowe, przykład
a
a
b
d
13/14
11/16
1/10
8/9
12/15
3/4
2/7
5/6
e
f
g
h
c
b
c
d
abe
abe
e
f
g
h
abe
abe