ASD Ćwiczenia 11: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 5 wersji utworzonych przez 3 użytkowników) | |||
Linia 1: | Linia 1: | ||
Niech <math>G=(V,E)</math> będzie grafem spójnym, a <math>w:E\rightarrow Z</math> funkcją, która każdej krawędzi <math>e</math> przypisuje | Niech <math>G=(V,E)</math> będzie grafem spójnym, a <math>w:E\rightarrow Z</math> funkcją, która każdej krawędzi <math>e</math> przypisuje nieujemną, całkowitoliczbową wagę <math>w(e)</math>. Dla każdego podgrafu <math>G'=(V',E')</math> definujemy wagę <math>W(G')</math> jako sumę wag jego krawędzi. Drzewo rozpinające grafu <math>G</math>, którego waga jest nie większa od wagi każdego innego drzewa rozpinającego w tym grafie, nazywamy ''minimalnym drzewem rozpinającym'' grafu <math>G</math>. W grafie może być więcej niż jedno drzewo rozpinające. | ||
==Zadanie 1== | ==Zadanie 1== | ||
Linia 7: | Linia 7: | ||
Wskazówka | Wskazówka | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Udowodnij, że następujący algorytm zachłanny oblicza minimalne drzewo rozpinające dla spójnego grafu <math>G=(V,E)</math>, a następnie wykaż, że gdy wagi są parami różne, to każde inne drzewo ma wagę większą. | |||
1 posortuj krawędzie według wag, od najmniejszej do największej, i niech | 1 posortuj krawędzie według wag, od najmniejszej do największej, i niech | ||
Linia 15: | Linia 15: | ||
4 '''begin''' | 4 '''begin''' | ||
5 <math>i := i+1</math>; | 5 <math>i := i+1</math>; | ||
6 '''if''' graf <math>(V,F\cup \{e_i | 6 '''if''' graf <math>(V,F\cup \{e_i\})</math> nie zawiera cyklu '''then''' | ||
7 <math>F := F \cup \{e_i\}</math> | 7 <math>F := F \cup \{e_i\}</math> | ||
8 '''end'''; | 8 '''end'''; | ||
Linia 30: | Linia 30: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Wykorzystaj algorytm podany we wskazówce do zadania 1. W trakcie działania tego algorytmu graf <math>T=(V,F)</math> jest lasem, czyli zbiorem rozłącznych drzew. Zbiory wierzchołków drzew w lesie tworzą podział zbioru <math>V</math>. Żeby sprawdzić, czy dołączenie nowej krawędzi do lasu powoduje powstanie cyklu, wystarczy wiedzieć, czy końce tej krawędzi łączą wierzchołki w tym samym drzewie (zbiorze). Dodanie | Wykorzystaj algorytm podany we wskazówce do zadania 1. W trakcie działania tego algorytmu graf <math>T=(V,F)</math> jest lasem, czyli zbiorem rozłącznych drzew. Zbiory wierzchołków drzew w lesie tworzą podział zbioru <math>V</math>. Żeby sprawdzić, czy dołączenie nowej krawędzi do lasu powoduje powstanie cyklu, wystarczy wiedzieć, czy końce tej krawędzi łączą wierzchołki w tym samym drzewie (zbiorze). Dodanie krawędzi powoduje połączenia dwóch drzew (zbiorów) w jedno drzewa (jeden zbiór). Naturalną strukturą danych do implementacji dynamicznego lasu <math>T</math> jest struktura zbiorów rozłącznych (Find-Union). Podany algorytm jest znany pod nazwą algorytmu Kruskala. | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 3== | |||
W przedstawionym przez nas algorytmie Dijkstry obliczaliśmy długości najlżejszych ścieżek łączących wszystkie wierzchołki grafu z wyróżnionym wierzchołkiem <math>s</math>. Zastanów się, w jaki sposób poprawić algorytm Dijkstry, żeby po zakończeniu jego działania można było dla każdego wierzchołka wyznaczyć najlżejszą | W przedstawionym przez nas algorytmie Dijkstry obliczaliśmy długości najlżejszych ścieżek łączących wszystkie wierzchołki grafu z wyróżnionym wierzchołkiem <math>s</math>. Zastanów się, w jaki sposób poprawić algorytm Dijkstry, żeby po zakończeniu jego działania można było dla każdego wierzchołka wyznaczyć najlżejszą ścieżkę łączącą ten wierzchołek z <math>s</math> w czasie proporcjonalnym do długości tej ścieżki. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Linia 42: | Linia 42: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Za każdym razem, gdy w wierszu 17 aktualizujemy wartość <math>w[v]</math> na <math>w[u]+w(u-v)</math> należy w zmiennej <math>p[v]</math> zapamiętać wierzchołek <math>u</math>. Po zakończeniu wykonywania algorytmu najlżejszą ścieżkę z <math>v</math> do <math>s</math> tworzą wierzchołki <math>v, p[v], p[p[v]], \ldots, | Za każdym razem, gdy w wierszu 17 aktualizujemy wartość <math>w[v]</math> na <math>w[u]+w(u-v)</math>, należy w zmiennej <math>p[v]</math> zapamiętać wierzchołek <math>u</math>. Po zakończeniu wykonywania algorytmu najlżejszą ścieżkę z <math>v</math> do <math>s</math> tworzą wierzchołki <math>v, p[v], p[p[v]], \ldots, s</math>. | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 4== | |||
Niech <math>G=(V,E)</math> będzie spójnym grafem z wagami <math>w</math> i niech <math>s</math> będzie wyróżnionym wierzchołkiem. Dla każdego wierzchołka <math>v \in V</math> ustalmy jedną, najlżejszą ścieżkę łączącą <math>v</math> z <math>s</math>. | Niech <math>G=(V,E)</math> będzie spójnym grafem z wagami <math>w</math> i niech <math>s</math> będzie wyróżnionym wierzchołkiem. Dla każdego wierzchołka <math>v \in V</math> ustalmy jedną, najlżejszą ścieżkę łączącą <math>v</math>z<math>s</math>. | ||
a) Niech <math>F</math> będzie zbiorem wszystkich krawędzi występujących na ustalonych ścieżkach. Udowodnij, że podgraf <math>H=(V,F)</math> jest drzewem. Drzewo <math>H</math> nazywamy | a) Niech <math>F</math> będzie zbiorem wszystkich krawędzi występujących na ustalonych ścieżkach. Udowodnij, że podgraf <math>H=(V,F)</math> jest drzewem. Drzewo <math>H</math> nazywamy ''drzewem najlżejszych ścieżek''. Może być wiele drzew najlżejszych ścieżek. | ||
b) W rozwiązaniu zadania 3 pokazaliśmy, w jaki sposób obliczyć drzewo najlżejszych ścieżek algorytmem Dijkstry. Zmodyfikuj algorytm Dijsktry w taki sposób, żeby posłużył on do obliczania minimalnego drzewa rozpinającego. | b) W rozwiązaniu zadania 3 pokazaliśmy, w jaki sposób obliczyć drzewo najlżejszych ścieżek algorytmem Dijkstry. Zmodyfikuj algorytm Dijsktry w taki sposób, żeby posłużył on do obliczania minimalnego drzewa rozpinającego. | ||
Linia 58: | Linia 58: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Wystarczy zmienić regułę przenoszenia wierzchołków ze zbioru <math>R</math> do <math>L</math>. Do zbioru <math>L</math> przenosimy ten wierzchołek z <math>R</math>, który jest połączony z wierzchołkiem z <math>L</math> krawędzią o najmniejszej wadze. | Wystarczy zmienić regułę przenoszenia wierzchołków ze zbioru <math>R</math> do zbioru <math>L</math>. Do zbioru <math>L</math> przenosimy ten wierzchołek z <math>R</math>, który jest połączony z wierzchołkiem z <math>L</math> krawędzią o najmniejszej wadze. Ten algorytm jest znany pod nazwą algorytmu Prima. | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 10:18, 31 sie 2023
Niech będzie grafem spójnym, a funkcją, która każdej krawędzi przypisuje nieujemną, całkowitoliczbową wagę . Dla każdego podgrafu definujemy wagę jako sumę wag jego krawędzi. Drzewo rozpinające grafu , którego waga jest nie większa od wagi każdego innego drzewa rozpinającego w tym grafie, nazywamy minimalnym drzewem rozpinającym grafu . W grafie może być więcej niż jedno drzewo rozpinające.
Zadanie 1
Udowodnij, że jeśli wagi krawędzi są parami różne, to w grafie istnieje dokładnie jedno minimalne drzewo rozpinające.
Wskazówka
Zadanie 2
Załóżmy, że graf jest reprezentowany przez listy sąsiedztw i krawędzie grafu są już posortowane niemalejąco według wag. Zaproponuj algorytm, który w czasie obliczy dla G minimalne drzewo rozpinające.
Wskazówka
Zadanie 3
W przedstawionym przez nas algorytmie Dijkstry obliczaliśmy długości najlżejszych ścieżek łączących wszystkie wierzchołki grafu z wyróżnionym wierzchołkiem . Zastanów się, w jaki sposób poprawić algorytm Dijkstry, żeby po zakończeniu jego działania można było dla każdego wierzchołka wyznaczyć najlżejszą ścieżkę łączącą ten wierzchołek z w czasie proporcjonalnym do długości tej ścieżki.
Rozwiązanie
Zadanie 4
Niech będzie spójnym grafem z wagami i niech będzie wyróżnionym wierzchołkiem. Dla każdego wierzchołka ustalmy jedną, najlżejszą ścieżkę łączącą z.
a) Niech będzie zbiorem wszystkich krawędzi występujących na ustalonych ścieżkach. Udowodnij, że podgraf jest drzewem. Drzewo nazywamy drzewem najlżejszych ścieżek. Może być wiele drzew najlżejszych ścieżek.
b) W rozwiązaniu zadania 3 pokazaliśmy, w jaki sposób obliczyć drzewo najlżejszych ścieżek algorytmem Dijkstry. Zmodyfikuj algorytm Dijsktry w taki sposób, żeby posłużył on do obliczania minimalnego drzewa rozpinającego.
Rozwiązanie