Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Odśnieżanie

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: luty 2013
  • Publikacja elektroniczna: 31-01-2013

Zadanie Odśnieżanie z zeszłorocznego Obozu Naukowo-Treningowego im. A. Kreczmara można sformułować w języku teorii grafów następująco. W nieskierowanym, ważonym, spójnym grafie math wyróżniono cztery wierzchołki. Należy usunąć część krawędzi z grafu tak, żeby nadal istniały ścieżki pomiędzy każdą parą wyróżnionych wierzchołków i żeby suma wag krawędzi, które pozostały w grafie, była jak najmniejsza.

Oznaczmy zbiór wierzchołków grafu math  przez math i niech math oznaczają liczbę wierzchołków i krawędzi w grafie. Niech math będą wyróżnionymi wierzchołkami. Szukany optymalny zestaw nieusuniętych krawędzi na pewno nie będzie zawierać cyklu. Gdyby były tylko dwa wyróżnione wierzchołki, math i  math to nieusunięte krawędzie tworzyłyby najkrótszą ścieżkę z  math do math W przypadku trzech wyróżnionych wierzchołków od ścieżki z  math do math w pewnym miejscu odchodziłaby jeszcze ścieżka do math Po chwili namysłu dochodzimy do wniosku, że w przypadku czterech wyróżnionych wierzchołków nieusunięte krawędzie powinny tworzyć kształt taki jak na poniższym rysunku. Wyróżnione wierzchołki są tutaj połączone ścieżkami z pewnymi dwoma wierzchołkami math i  math (nazwijmy je wierzchołkami centralnymi), które również są połączone ścieżką. Bez straty ogólności wierzchołek math i pewien inny wierzchołek math dla math są połączone z  math pozostałe dwa są połączone z  math Rysunek obejmuje również przypadki, gdy niektóre wierzchołki pokrywają się (np. math lub math) – w takich sytuacjach odpowiednie ścieżki mają zerową długość.

obrazek

Jeśli przez math oznaczymy długość najkrótszej ścieżki pomiędzy wierzchołkami math i  math to koszt powyższego rozwiązania wynosi

display-math

Parę wierzchołków centralnych math i  math możemy wybrać na math sposobów, zaś wierzchołek math  na trzy sposoby. Jednak złożoność czasowa algorytmu jest zdominowana przez obliczenie tablicy math które wykonujemy w czasie math  za pomocą math wywołań algorytmu Dijkstry.

Zadanie można rozwiązać szybciej. Ustalmy math Niech graf math  powstaje przez dodanie do grafu math  dodatkowych wierzchołków math i dodatkowych krawędzi: wierzchołek math łączymy z każdym wierzchołkiem math krawędzią o wadze math zaś wierzchołek math łączymy z każdym math krawędzią o wadze math

Zauważmy, że ścieżka math w grafie math  odpowiada rozwiązaniu, w którym jako wierzchołki centralne wybieramy math i  math koszt takiego rozwiązania jest równy długości tej ścieżki. Tak więc, aby rozwiązać zadanie, wystarczy dla każdego math znaleźć najkrótszą ścieżkę z  math do math w grafie math

Do konstrukcji grafu math  musimy wyznaczyć wartości math dla math i  math Ostatecznie nasze rozwiązanie wymaga siedmiu wywołań algorytmu Dijkstry (czterech w grafie math  do obliczenia math i po jednym w grafie math  dla każdego wyboru math). Graf math  ma math wierzchołków i  math  krawędzi, więc koszt algorytmu Dijkstry jest w nim taki sam jak w grafie math  Zatem rozwiązanie działa w czasie math