ASD Ćwiczenia 11: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Diks (dyskusja | edycje)
Diks (dyskusja | edycje)
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ędzie powoduje połączenia dwóch drzew (zbirów) w jedno (jeden). Naturalną strukturą danych do implementacji dynamicznego lasu <math>T</math> jest struktura zbiorów rozłącznych (Find-Union).
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ędzie powoduje połączenia dwóch drzew (zbirów) w jedno (jeden). 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'''
==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ą ścieżką łączącą ten wierzchołek z <math>s</math> w czasie proporcjonalnym do długości tej ścieżki.
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.
Linia 46: Linia 46:
</div>
</div>


```Zadanie 4```
==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 ```drzewem najlżejszych ścieżek```. Może być wiele drzew najlżejszych ścieżek.
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 <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 09:42, 29 wrz 2006

Niech G=(V,E) będzie grafem spójnym, a w:EZ funkcją, która każdej krawędzi e przypisuje nieujemą, całkowitoliczbową wagę w(e). Dla każdego podgrafu G=(V,E) definujemy wagę W(G) jako sumę wag jego krawędzi. Drzewo rozpinające grafu G, którego waga jest nie większa o od wagi każdego innego drzewa rozpinającego w tym grafie nazywamy minimalnym drzewem rozpinającym grafu G. 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 G jest reprezentowany przez listy sąsiedztw i krawędzie grafu są już posortowane niemalejąco według wag. Zaproponuj algorytm, który w czasie O(nlog*n) 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 s. 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 s w czasie proporcjonalnym do długości tej ścieżki.

Rozwiązanie

Zadanie 4

Niech G=(V,E) będzie spójnym grafem z wagami w i niech s będzie wyróżnionym wierzchołkiem. Dla każdego wierzchołka vV ustalmy jedną, najlżejszą ścieżkę łączącą v z s.

a) Niech F będzie zbiorem wszystkich krawędzi występujących na ustalonych ścieżkach. Udowodnij, że podgraf H=(V,F) jest drzewem. Drzewo H 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