ASD Ćwiczenia 11: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
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 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 | 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== | ||
Udowodnij, że jeśli wagi krawędzi są parami różne, w grafie istnieje dokładnie jedno minimalne drzewo rozpinające. | Udowodnij, że jeśli wagi krawędzi są parami różne, to w grafie istnieje dokładnie jedno minimalne drzewo rozpinające. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
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 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 krawędzi powoduje połączenia dwóch drzew ( | 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> | ||
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, <math>s</math>. | 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, <math>s</math>. | ||
</div> | </div> | ||
</div> | </div> | ||
Linia 49: | Linia 49: | ||
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. Ten algorytm jest znany pod nazwą algorytmu Prima. | 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> |
Wersja z 16:22, 5 paź 2006
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