• Nie Znaleziono Wyników

Algorytmy Grafowe Rozdział 5.1. Generowanie wszystkich drzew rozpiętych. Katarzyna Rybarczyk-Krzywdzińska

N/A
N/A
Protected

Academic year: 2022

Share "Algorytmy Grafowe Rozdział 5.1. Generowanie wszystkich drzew rozpiętych. Katarzyna Rybarczyk-Krzywdzińska"

Copied!
46
0
0

Pełen tekst

(1)

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

(2)

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.

(3)

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

(4)

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

(5)

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

(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

(7)

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

(8)

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?

....

(9)

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

(10)

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

(11)

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

(12)

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 u6= xold powtarzamy:

p := u; u:= u+; u+:= p(u); p(u) := p

(13)

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 u6= xold powtarzamy:

p := u; u:= u+; u+:= p(u); p(u) := p

(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)

(14)

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 u6= xold powtarzamy:

p := u; u:= u+; u+:= p(u); p(u) := p

(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)

(15)

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 u6= xold powtarzamy:

p := u; u:= u+; u+:= p(u); p(u) := p

(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)

(16)

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 u6= xold powtarzamy:

p := u; u:= u+; u+:= p(u); p(u) := p

(Zamieniamy skierowanie krawędzi na ścieżce z v do xold.)

(17)

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 u6= xold powtarzamy:

p := u; u:= u+; u+:= p(u); p(u) := p

5 Opcjonalnie możemy zamienić korzenie na nowe

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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.

(26)

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.

(27)

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

(28)

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

(29)

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

(30)

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

(31)

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.

(32)

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

(33)

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.

(34)

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.

(35)

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.

(36)

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.

(37)

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.

(38)

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.

(39)

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

(40)

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

(41)

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 vzostał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

(42)

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

(43)

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

(44)

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

(45)

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)

(46)

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

Cytaty

Powiązane dokumenty

Chodzi tu bowiem o to, że ilość energii przetwarzana przez system autonomiczny zależy od masy tego systemu i różnic potencjałów, koniecznych do

Drzewo rozpinające grafu G jest to spójny podgraf, który zawiera wszystkie wierzchołki należące do G i jest drzewem.. Minimalne drzewo rozpinające grafu posiada

Dzisiejsze zadanie zdalne polega na sporządzeniu notatki w waszych zeszytach i wpisanie poniższych informacji. Są to nazwy gatunków drzew występujących w przyrodzie, oczywiście

Drzewo binarne to drzewo ukorzenione uporz¡dkowane, w którym ka»dy wierzchoªek ró»ny od li±cia (tzw. wierzchoªek wewn¦trzny) ma dwa wierzchoªki potomne.. Na rysunku

Wielozmysłowa obserwacja drzew (kory, gałęzi, liści) gołym okiem oraz za pomocą lupy (szukanie owadów), poprzez przykładanie ucha i sprawdzanie, czy czegoś nie

Algorytm Kruskala może być zrealizowany jako funkcja otrzymująca jako argument graf (lub listę wszystkich krawędzi) i zwracająca jako wynik minimalne drzewo rozpinające (wynik

Narysować w Magicznych Bloczkach schemat blokowy algorytmu sor- towania przez wstawianie. Opis algorytmu można znaleźć

Funkcja connect() nie może być ponawiana bez uprzedniego otworzenia nowego gniazda. Przebieg współpracy z serwerem określa protokół komunikacji. TCP jest protokołem