Niech będzie grafem spójnym, a funkcją, która każdej krawędzi przypisuje nieujemą, 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 o 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
Wykaż, że następujący algorytm zachłanny oblicza minimalne drzewo rozpinające dla spójnego grafu , 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
//e_1, e_2,\ldots, e_m będdzie ciągiem posortowanych krawędzi.
2 ; ;
3 while do
4 begin
5 ;
6 if graf Parser nie mógł rozpoznać (błąd składni): {\displaystyle (V,F\cup \{e_i}\})}
nie zawiera cyklu then
7
8 end;
9 return ;
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
Wykorzystaj algorytm podany we wskazówce do zadania 1. W trakcie działania tego algorytmu graf jest lasem, czyli zbiorem rozłącznych drzew. Zbiory wierzchołków drzew w lesie tworzą podział zbioru . Ż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 jest struktura zbiorów rozłącznych (Find-Union).