Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytmy Grafowe
Rozdział 5.1. Generowanie wszystkich drzew rozpiętych.
Katarzyna Rybarczyk-Krzywdzińska
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Liczba drzew rozpiętych grafu
Ile graf ma drzew rozpiętych?
τ (G ) – liczba drzew rozpiętych (multi)grafu G Przypomnienie z MADów
Twierdzenie
Jeśli e ∈ E nie jest pętlą w (multi)grafie G , to τ (G ) = τ (G − e) + τ (G · e)
G − e powstaje z G przez usunięcie krawędzi e;
G · e powstaje z G przez ściągnięcie krawędzi e.
Twierdzenie (Cayleya)
τ (Kn) = nn−1.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Liczba drzew rozpiętych grafu
Ile graf ma drzew rozpiętych?
A to będzie na Teoretycznych Podstawach Informatyki Twierdzenie (Twierdzenie Kirchhoffa)
Niech λ1, . . . , λn−1 będą niezerowymi wartościami własnymi Laplasjanu spójnego, oznaczonego grafu prostego G , wtedy liczba drzew rozpiętych grafu G jest równa:
τ (G ) = 1
|V (G )|λ1. . . λ|V |−1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Liczba drzew rozpiętych grafu
Twierdzenie Kirchhoffa - przykład
Graf Macierz stopni i macierz przyległości
D(G ) =
2 0 0 0 0 0
0 3 0 0 0 0
0 0 2 0 0 0
0 0 0 1 0 0
0 0 0 0 3 0
0 0 0 0 0 1
A(G ) =
0 1 1 0 0 0
1 0 1 0 1 0
1 1 0 0 0 0
0 0 0 0 1 0
0 1 0 1 0 1
0 0 0 0 1 0
Laplasjan Wartości własne Laplasjanu
Q(G ) = D(G ) − A(G ) =
2 −1 −1 0 0 0
−1 3 −1 0 −1 0
−1 −1 2 0 0 0
0 0 0 1 −1 0
0 −1 0 −1 3 −1
0 0 0 0 −1 1
λ1= 1 2 5 +√
17
λ2= 3 λ3= 3 λ4= 1
λ5= 1 2 5 −√
17
λ6= 0
Liczba drzew rozpiętych
τ (G ) = 1
|V (G )|λ1. . . λ|V |−1= 1 6
·1 2 5 +
√ 17
· 3 · 3 · 1 ·1 2 5 −
√ 17
= 3
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
idea algorytmu
Jak zapisać efektywnie drzewo?
Np. podobnie jak w alg. Prima za pomocą poprzedników p(·).
Przykład: v 1 2 3 4 5
p(v ) 3 4 - 3 4
1
2 3
4
5
Jak zapisać efektywnie las?
Np. każdemu drzewu przypisać korzeń i zapamiętać w etykiecie korzenia r (·) (jak w alg. Kruskala).
Przykład:
v 1 2 3 4 5 6
p(v ) - 1 6 5 1 - r (v ) 1 1 6 1 1 6
1
2 3
4 5
6
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
idea algorytmu
Jak zapisać efektywnie drzewo?
Np. podobnie jak w alg. Prima za pomocą poprzedników p(·).
Jak zapisać efektywnie las?
Np. każdemu drzewu przypisać korzeń i zapamiętać w etykiecie korzenia r (·) (jak w alg. Kruskala).
Przykład:
v 1 2 3 4 5 6
p(v ) - 1 6 5 1 - r (v ) 1 1 6 1 1 6
1
2 3
4 5
6
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
idea algorytmu
Jak wygenerować dowolne drzewo rozpięte?
Np. Zastosować algorytm Kruskala dla dowolnie posortowanej listy krawędzi.
Powtarzaj aż |T | = |V | − 1 lub nie ma już kolejnej krawędzi na liście:
1 pobierz e – kolejną krawędź z listy;
2 jeśli krawędzie z T ∪ {e} nie indukują cyklu, to dodaj e do T . (Możemy tu zastosować etykietowanie związane
z korzeniami r (·) drzew lasu).
Jak zapamiętać poprzedniki p(·) po połączeniu drzew? ....
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
idea algorytmu
Jak wygenerować dowolne drzewo rozpięte?
Np. Zastosować algorytm Kruskala dla dowolnie posortowanej listy krawędzi.
Powtarzaj aż |T | = |V | − 1 lub nie ma już kolejnej krawędzi na liście:
1 pobierz e – kolejną krawędź z listy;
2 jeśli krawędzie z T ∪ {e} nie indukują cyklu, to dodaj e do T . (Możemy tu zastosować etykietowanie związane
z korzeniami r (·) drzew lasu).
Jak zapamiętać poprzedniki p(·) po połączeniu drzew?
....
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
NewRoot(v ) i AddEdge(e = (u, v)) - idea
1
3
4 5
6
8 2
7
(u, v ) = (5, 7)
v 1 2 3 4 5 6 7 8
p(v ) - 1 6 5 1 - 3 3
r (v ) 1 1 6 1 1 6 6 6
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
NewRoot(v ) i AddEdge(e = (u, v)) - idea
1
3
4 5
6
8 2
7
(u, v ) = (5, 7)
v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 - 3
r (v ) 1 1 7 1 1 7 7 7
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
NewRoot(v ) i AddEdge(e = (u, v)) - idea
1
3
4 5
6
8 2
7
(u, v ) = (5, 7)
v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 5 3
r (v ) 1 1 1 1 1 1 1 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury NewRoot(v )
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 6 5 1 - 3 3
r (v ) 1 1 6 1 1 6 6 6 Zanim dodamy uv ustawimy poprzedniki w drzewie wierzchołka v tak, aby „wskazywały w kierunku” nowego korzenia (kraw. uv).
NewRoot(v )
1 xold := r (v ) (xold korzeń wierzchołka v )
2 Jeżeli xold = v to STOP.
3 u−:= None, u+:= v
4 Dopóki u−6= xold powtarzamy:
p := u−; u−:= u+; u+:= p(u−); p(u−) := p
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury NewRoot(v )
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 6 5 1 - 3 3
r (v ) 1 1 6 1 1 6 6 6 xold = 6, v = 7
NewRoot(v )
1 xold := r (v ) (xold korzeń wierzchołka v )
2 Jeżeli xold = v to STOP.
3 u−:= None, u+:= v
4 Dopóki u−6= xold powtarzamy:
p := u−; u−:= u+; u+:= p(u−); p(u−) := p
(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury NewRoot(v )
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 6 5 1 - - 3
r (v ) 1 1 6 1 1 6 6 6 xold = 6, v = 7
u−:= None, u+:= 7
p := None, u−:= 7, u+:= p(7) = 3, p(7) := None NewRoot(v )
1 xold := r (v ) (xold korzeń wierzchołka v )
2 Jeżeli xold = v to STOP.
3 u−:= None, u+:= v
4 Dopóki u−6= xold powtarzamy:
p := u−; u−:= u+; u+:= p(u−); p(u−) := p
(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury NewRoot(v )
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 - - 3
r (v ) 1 1 6 1 1 6 6 6 xold = 6, v = 7
u−:= 7, u+:= 3
p := 7, u−:= 3, u+:= p(3) = 6, p(3) := 7 NewRoot(v )
1 xold := r (v ) (xold korzeń wierzchołka v )
2 Jeżeli xold = v to STOP.
3 u−:= None, u+:= v
4 Dopóki u−6= xold powtarzamy:
p := u−; u−:= u+; u+:= p(u−); p(u−) := p
(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury NewRoot(v )
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 - 3
r (v ) 1 1 6 1 1 6 6 6 xold = 6, v = 7
u−:= 3, u+:= 6
p := 3, u−:= 6, u+:= p(6) = −, p(6) := 3 NewRoot(v )
1 xold := r (v ) (xold korzeń wierzchołka v )
2 Jeżeli xold = v to STOP.
3 u−:= None, u+:= v
4 Dopóki u−6= xold powtarzamy:
p := u−; u−:= u+; u+:= p(u−); p(u−) := p
(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury NewRoot(v )
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 - 3
r (v ) 1 1 7 1 1 7 7 7 xold = 6, v = 7
u−:= 3, u+:= 6
p := 3,u−:= 6, u+:= p(6) = −, p(6) := 3 NewRoot(v )
1 xold := r (v ) (xold korzeń wierzchołka v )
2 Jeżeli xold = v to STOP.
3 u−:= None, u+:= v
4 Dopóki u−6= xold powtarzamy:
p := u−; u−:= u+; u+:= p(u−); p(u−) := p
5 Opcjonalnie możemy zamienić korzenie na nowe
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury AddEdge(e = (u, v))
Po dodaniu uv „łączymy” drzewa o korzeniach r (u) i r (v ).
AddEdge(e = (u, v))
1 NewRoot(v )
2 p(v ) := u (dodajemy uv )
3 x1:= r (v ); x2 := r (u); (zapamiętujemy korzenie)
4 Dla każdego wierzchołka w ∈ V (G ): Jeśli r (w ) = x1, to r (w ) := x2
(Wszystkie wierzchołki z drzewa wierzchołka v otrzymują korzeń drzewa wierzchołka u)
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 6 5 1 - 3 3
r (v ) 1 1 6 1 1 6 6 6
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury AddEdge(e = (u, v))
Po dodaniu uv „łączymy” drzewa o korzeniach r (u) i r (v ).
AddEdge(e = (u, v))
1 NewRoot(v )
2 p(v ) := u (dodajemy uv )
3 x1:= r (v ); x2 := r (u); (zapamiętujemy korzenie)
4 Dla każdego wierzchołka w ∈ V (G ): Jeśli r (w ) = x1, to r (w ) := x2
(Wszystkie wierzchołki z drzewa wierzchołka v otrzymują korzeń drzewa wierzchołka u)
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 - 3
r (v ) 1 1 6 1 1 6 6 6
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury AddEdge(e = (u, v))
Po dodaniu uv „łączymy” drzewa o korzeniach r (u) i r (v ).
AddEdge(e = (u, v))
1 NewRoot(v )
2 p(v ) := u (dodajemy uv )
3 x1:= r (v ); x2 := r (u); (zapamiętujemy korzenie)
4 Dla każdego wierzchołka w ∈ V (G ): Jeśli r (w ) = x1, to r (w ) := x2
(Wszystkie wierzchołki z drzewa wierzchołka v otrzymują korzeń drzewa wierzchołka u)
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 5 3
r (v ) 1 1 6 1 1 6 6 6
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury AddEdge(e = (u, v))
Po dodaniu uv „łączymy” drzewa o korzeniach r (u) i r (v ).
AddEdge(e = (u, v))
1 NewRoot(v )
2 p(v ) := u (dodajemy uv )
3 x1:= r (v ); x2 := r (u); (zapamiętujemy korzenie)
4 Dla każdego wierzchołka w ∈ V (G ):
Jeśli r (w ) = x1, to r (w ) := x2
(Wszystkie wierzchołki z drzewa wierzchołka v otrzymują korzeń drzewa wierzchołka u)
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 - 3
r (v ) 1 1 1 1 1 1 1 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury AddEdge(e = (u, v))
Po dodaniu uv „łączymy” drzewa o korzeniach r (u) i r (v ).
AddEdge(e = (u, v))
1 NewRoot(v )
2 p(v ) := u (dodajemy uv )
3 x1:= r (v ); x2 := r (u); (zapamiętujemy korzenie)
4 Dla każdego wierzchołka w ∈ V (G ):
Jeśli r (w ) = x1, to r (w ) := x2
UWAGA: Tak jak w przypadku algorytmu Kruskala, żeby otrzymać optymalną złożoność, musimy zastosować odpowiednie struktury danych dla zbiorów rozłącznych.
1
3 4
5
8 2
7
6 v 1 2 3 4 5 6 7 8
p(v ) - 1 7 5 1 3 - 3
r (v ) 1 1 1 1 1 1 1 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Procedura DeleteEdge(e = (u, v))
Jak skonstruujemy drzewo, to będziemy usuwać z niego niektóre krawędzie, żeby uzyskać inne drzewo rozpięte.
1 2
3 4 5
6 7 8 9
10
11 12
13 14
(u, v ) = (4, 8)
v 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p(v ) 3 1 - 3 9 8 13 4 3 8 6 4 8 2
r (v ) 3 3 3 3 3 3 3 3 3 3 3 3 3 3
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Procedura DeleteEdge(e = (u, v))
Jak skonstruujemy drzewo, to będziemy usuwać z niego niektóre krawędzie, żeby uzyskać inne drzewo rozpięte.
1 2
3 4 5
6 7 8 9
10
11 12
13 14
(u, v ) = (4, 8)
v 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p(v ) 3 1 - 3 9 8 13 - 3 8 6 4 8 2
r (v ) 3 3 3 3 3 8 8 8 3 8 8 3 8 3
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury DeleteEdge(e = (u, v))
Poniższa procedura dzieli drzewo T zawierające krawędź e, na dwa drzewa T1 i T2 powstałe po usunięciu e z T .
DeleteEdge(e = (u, v))
1 Jeśli p(u) = v , to v1 := v i v2 := u w p.p. v1 := u i v2 := v
2 p(v2) := NONE
3 Dla każdego wierzchołka w z T2: r (w ) := v2
v1 = 4, v2 = 8
1 2
3 4 5
6 7 8 9
10
11 12
13 14
UWAGA: To jak znajdujemy wierzchołki z T2zależy od tego jak zaimplementowaliśmy korzenie/poprzedniki.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Opis procedury DeleteEdge(e = (u, v))
Poniższa procedura dzieli drzewo T zawierające krawędź e, na dwa drzewa T1 i T2 powstałe po usunięciu e z T .
DeleteEdge(e = (u, v))
1 Jeśli p(u) = v , to v1 := v i v2 := u w p.p. v1 := u i v2 := v
2 p(v2) := NONE
3 Dla każdego wierzchołka w z T2: r (w ) := v2
v1 = 4, v2 = 8
1 2
3 4 5
6 7 8 9
10
11 12
13 14
UWAGA: To jak znajdujemy wierzchołki z T2zależy od tego jak zaimplementowaliśmy korzenie/poprzedniki.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte - idea
Ustalamy dowolny v∗. Zaczynamy z listą krawędzi:
indeksy 1 2 . . . deg(v∗) . . . |E | krawędzie e1 e2 . . . edeg(v∗) . . . e|E |
e1, e2, . . . , edeg(v∗)– krawędzie incydentne z v∗.
Budujemy drzewo jak w algorytmie Kruskala. (Korzystamy z AddEdge i NewRoot).
Zapamiętujemy kolejne krawędzie wykorzystując indeksy krawędzi: np. Tree(1) = 1, Tree(2) = 3, . . . , Tree(|V | − 1) = 100
oznacza, że do drzewa kolejno dodaliśmy e1, e3, . . . , e100. Jeśli utworzymy drzewo lub skończymy przeglądać listę,
usuwamy ostatnią dodaną krawędź (DeleteEdge) i zamiast niej pobieramy kolejną za nią z listy (jeśli nie ma takiej, to usuwamy kolejną ostatnią krawędź (DeleteEdge)).
Kończymy gdy Tree(1) = edeg(v∗)+ 1 tzn. zostały zanalizowane wszystkie drzewa zawierające krawędzie incydentne z v∗
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte - idea
Ustalamy dowolny v∗. Zaczynamy z listą krawędzi:
indeksy 1 2 . . . deg(v∗) . . . |E | krawędzie e1 e2 . . . edeg(v∗) . . . e|E |
e1, e2, . . . , edeg(v∗)– krawędzie incydentne z v∗. Budujemy drzewo jak w algorytmie Kruskala.
(Korzystamy z AddEdge i NewRoot).
Zapamiętujemy kolejne krawędzie wykorzystując indeksy krawędzi:
np. Tree(1) = 1, Tree(2) = 3, . . . , Tree(|V | − 1) = 100 oznacza, że do drzewa kolejno dodaliśmy e1, e3, . . . , e100.
Jeśli utworzymy drzewo lub skończymy przeglądać listę,
usuwamy ostatnią dodaną krawędź (DeleteEdge) i zamiast niej pobieramy kolejną za nią z listy (jeśli nie ma takiej, to usuwamy kolejną ostatnią krawędź (DeleteEdge)).
Kończymy gdy Tree(1) = edeg(v∗)+ 1 tzn. zostały zanalizowane wszystkie drzewa zawierające krawędzie incydentne z v∗
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte - idea
Ustalamy dowolny v∗. Zaczynamy z listą krawędzi:
indeksy 1 2 . . . deg(v∗) . . . |E | krawędzie e1 e2 . . . edeg(v∗) . . . e|E |
e1, e2, . . . , edeg(v∗)– krawędzie incydentne z v∗. Budujemy drzewo jak w algorytmie Kruskala.
(Korzystamy z AddEdge i NewRoot).
Zapamiętujemy kolejne krawędzie wykorzystując indeksy krawędzi:
np. Tree(1) = 1, Tree(2) = 3, . . . , Tree(|V | − 1) = 100 oznacza, że do drzewa kolejno dodaliśmy e1, e3, . . . , e100. Jeśli utworzymy drzewo lub skończymy przeglądać listę,
usuwamy ostatnią dodaną krawędź (DeleteEdge) i zamiast niej pobieramy kolejną za nią z listy (jeśli nie ma takiej, to usuwamy kolejną ostatnią krawędź (DeleteEdge)).
Kończymy gdy Tree(1) = edeg(v∗)+ 1 tzn. zostały zanalizowane wszystkie drzewa zawierające krawędzie incydentne z v∗
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte - idea
Ustalamy dowolny v∗. Zaczynamy z listą krawędzi:
indeksy 1 2 . . . deg(v∗) . . . |E | krawędzie e1 e2 . . . edeg(v∗) . . . e|E |
e1, e2, . . . , edeg(v∗)– krawędzie incydentne z v∗. Budujemy drzewo jak w algorytmie Kruskala.
(Korzystamy z AddEdge i NewRoot).
Zapamiętujemy kolejne krawędzie wykorzystując indeksy krawędzi:
np. Tree(1) = 1, Tree(2) = 3, . . . , Tree(|V | − 1) = 100 oznacza, że do drzewa kolejno dodaliśmy e1, e3, . . . , e100. Jeśli utworzymy drzewo lub skończymy przeglądać listę,
usuwamy ostatnią dodaną krawędź (DeleteEdge) i zamiast niej pobieramy kolejną za nią z listy (jeśli nie ma takiej, to usuwamy kolejną ostatnią krawędź (DeleteEdge)).
Kończymy gdy Tree(1) = edeg(v∗)+ 1 tzn. zostały zanalizowane wszystkie drzewa zawierające krawędzie incydentne z v∗
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – oznaczenia
Oznaczenia:
r (v ) – korzeń drzewa, do którego aktualnie należy v ;
p(v ) – poprzednik w drzewie, do którego aktualnie należy v ; Tree(i ) – indeks krawędzi (na liście krawędzi) dodanej jako i -tej do aktualnie budowanego drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte -
przykład
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
I.
1 Utwórz listę krawędzi biorąc na jej początek krawędzie incydentne z dowolnie wybranym wierzchołkiem v∗: e1, e2, . . . , ed (v∗), ed (v∗)+1, . . . , em
2 Dla każdego wierzchołka v ∈ V (G ), r (v ) := v ; p(v ) := NONE .
3 k := 1 – wskaźnik wykorzystywany przy przeglądaniu krawędzi;
4 END := d (v∗) + 1 – będzie określał zakończenie działania algorytmu;
5 i := 0 – licznik, ile dodano krawędzi do drzewa;
6 Tree(1) := None – nie zaczęliśmy budować drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
I.
1 Utwórz listę krawędzi biorąc na jej początek krawędzie incydentne z dowolnie wybranym wierzchołkiem v∗: e1, e2, . . . , ed (v∗), ed (v∗)+1, . . . , em
2 Dla każdego wierzchołka v ∈ V (G ), r (v ) := v ; p(v ) := NONE .
3 k := 1 – wskaźnik wykorzystywany przy przeglądaniu krawędzi;
4 END := d (v∗) + 1 – będzie określał zakończenie działania algorytmu;
5 i := 0 – licznik, ile dodano krawędzi do drzewa;
6 Tree(1) := None – nie zaczęliśmy budować drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
I.
1 Utwórz listę krawędzi biorąc na jej początek krawędzie incydentne z dowolnie wybranym wierzchołkiem v∗: e1, e2, . . . , ed (v∗), ed (v∗)+1, . . . , em
2 Dla każdego wierzchołka v ∈ V (G ), r (v ) := v ; p(v ) := NONE .
3 k := 1 – wskaźnik wykorzystywany przy przeglądaniu krawędzi;
4 END := d (v∗) + 1 – będzie określał zakończenie działania algorytmu;
5 i := 0 – licznik, ile dodano krawędzi do drzewa;
6 Tree(1) := None – nie zaczęliśmy budować drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
I.
1 Utwórz listę krawędzi biorąc na jej początek krawędzie incydentne z dowolnie wybranym wierzchołkiem v∗: e1, e2, . . . , ed (v∗), ed (v∗)+1, . . . , em
2 Dla każdego wierzchołka v ∈ V (G ), r (v ) := v ; p(v ) := NONE .
3 k := 1 – wskaźnik wykorzystywany przy przeglądaniu krawędzi;
4 END := d (v∗) + 1 – będzie określał zakończenie działania algorytmu;
5 i := 0 – licznik, ile dodano krawędzi do drzewa;
6 Tree(1) := None – nie zaczęliśmy budować drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
I.
1 Utwórz listę krawędzi biorąc na jej początek krawędzie incydentne z dowolnie wybranym wierzchołkiem v∗: e1, e2, . . . , ed (v∗), ed (v∗)+1, . . . , em
2 Dla każdego wierzchołka v ∈ V (G ), r (v ) := v ; p(v ) := NONE .
3 k := 1 – wskaźnik wykorzystywany przy przeglądaniu krawędzi;
4 END := d (v∗) + 1 – będzie określał zakończenie działania algorytmu;
5 i := 0 – licznik, ile dodano krawędzi do drzewa;
6 Tree(1) := None – nie zaczęliśmy budować drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
I.
1 Utwórz listę krawędzi biorąc na jej początek krawędzie incydentne z dowolnie wybranym wierzchołkiem v∗: e1, e2, . . . , ed (v∗), ed (v∗)+1, . . . , em
2 Dla każdego wierzchołka v ∈ V (G ), r (v ) := v ; p(v ) := NONE .
3 k := 1 – wskaźnik wykorzystywany przy przeglądaniu krawędzi;
4 END := d (v∗) + 1 – będzie określał zakończenie działania algorytmu;
5 i := 0 – licznik, ile dodano krawędzi do drzewa;
6 Tree(1) := None – nie zaczęliśmy budować drzewa.
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy (Rozpatrujemy w pewnej kolejności, z nawracaniem, krawędzie ek= (uk, vk) zaczynając od e1= (u1, v1), bo k = 1 na początku)
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek); i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk)
(Jeśli rozpatrywana krawędź ek łączy dwa różne drzewa), to dodajemy ek za pomocą AddEdge(ek);
i := i + 1; (zapisujemy, że dodaliśmy w sumie i kraw. do drzewa)
Tree(i ) := k (zapisujemy indeks nowo dodanej krawędzi do drzewa).
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek);
i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
(Wszystkie krawędzie incydentne z v∗zostały rozpatrzone)
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek);
i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa (Skończyliśmy budować kolejne drzewo. Wypisać jego krawędzie można np. bazując na poprzednikach (p(·)) lub na indeksach z Tree)
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek);
i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| (Jeśli ostatnio dodana krawędź jest ostatnia na liście krawędzi), to
usuwamy ją za pomocą DeleteEdge(e|E (G )|)
i := i − 1 (Będziemy zaraz rozpatrywać krawędź, która przed nią została dodana do drzewa)
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek);
i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1 (w kolejnej turze rozpatrzymy krawędź znajdującą się na liście krawędzi zaraz po usuniętej)
4 i := i − 1 (zmieniamy licznik liczby krawędzi aktualnie dodanych do drzewa)
W przeciwnym przypadku k := k + 1
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek);
i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1 (w kolejnej turze weźmiemy kolejną krawędź z listy krawędzi)
Liczba drzew rozpiętych grafu Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący wszystkie drzewa rozpięte
Algorytm generujący drzewa – opis
II. Powtarzamy
1 Pobierz z listy ek= (uk, vk).
2 Jeśli r (uk) 6= r (vk) , to
dodajemy ek za pomocą AddEdge(ek);
i := i + 1;
Tree(i ) := k .
3 Jeśli Tree(1) = END, to STOP
4 Jeśli i = |V (G )| − 1, to wydajemy krawędzie zbudowanego drzewa
5 Jeśli i = |V (G )| − 1 lub k = |E (G )| (Jeśli zbudowaliśmy drzewo lub skończyły się krawędzie), to
1 Jeśli Tree(i ) = |E (G )| , to
usuwamy ją za pomocą DeleteEdge(e|E (G )|) i := i − 1
2 Usuwamy eTree(i )za pomocą DeleteEdge(eTree(i )).
3 k := Tree(i ) + 1
4 i := i − 1
W przeciwnym przypadku k := k + 1