Informatyczny kącik olimpijski
Trasowanie
Tym razem zajmiemy się zadaniem Routing z finałów Akademickich Mistrzostw Świata w Programowaniu Zespołowym z 2006 roku...
Po przetłumaczeniu historyjki o sieci komputerowej na język teorii grafów brzmi ono następująco. Dany jest skierowany graf mający wierzchołków, z których wyróżniamy początkowy i końcowy Chcemy znaleźć w grafie dwie skierowane ścieżki i (pierwszą z do a drugą z do ) tak, by łączna liczba wierzchołków, przez które przechodzą te ścieżki, była jak najmniejsza (Rys. 1).
W rozwiązaniu będziemy konstruowali obie ścieżki, poruszając się od wierzchołka dla pierwszej z nich zgodnie ze skierowaniem krawędzi, a dla drugiej – przeciwnie. Zdefiniujmy w tym celu ważony graf skierowany w którym z wierzchołka wychodzą krawędzie:
- (1)
- (1) do o wadze jeśli
- (2)
- (2) do o wadze jeśli
- (3)
- (3) do o wadze jeśli w istnieje skierowana ścieżka z do i najkrótsza taka ścieżka zawiera krawędzi.
Krawędzie (1) i (2) w odpowiadają przesuwaniu się ścieżką w zgodnie ze skierowaniem krawędzi i ścieżką przeciwnie do skierowania krawędzi. Natomiast krawędź (3) w odpowiada przesunięciu się obiema ścieżkami po tych samych krawędziach w Łatwo się więc przekonać, że jeżeli w istnieje ścieżka z do o wadze to oznacza, że w istnieją dwie ścieżki, pierwsza z do i druga z do takie że sumaryczna liczba wierzchołków, przez jakie przechodzą (nie licząc i ), jest równa co najwyżej W szczególności, ścieżka w z do o wadze implikuje istnienie rozwiązania zadania o koszcie
Pozostaje nam wykazać, że jeśli w optymalnym rozwiązaniu ścieżki i przechodzą przez wierzchołków, to w grafie istnieje ścieżka z do o wadze Niech będzie listą wierzchołków wspólnych dla obu ścieżek w kolejności, w jakiej te wierzchołki występują na ścieżce Powiemy, że wierzchołki tworzą blok, jeśli są one odwiedzane w tej kolejności również przez ścieżkę (oznaczymy to przez ). Zauważmy, że z optymalności ścieżek i wynika, że na każdej ze ścieżek między wierzchołkami należącymi do tego samego bloku nie występują wierzchołki spoza Podobny argument dowodzi tego, że jeśli ścieżka odwiedza wierzchołek jako najbliższy wierzchołek z po wierzchołku to Jeśli więc podzielimy na maksymalne bloki w kolejności ich odwiedzania przez ścieżkę to ścieżka będzie je odwiedzać w odwrotnej kolejności. Ponadto pierwszy i ostatni blok podziału będą to odpowiednio i
Pokażemy (Rys. 2), że dla kolejnych dwóch bloków i tego podziału istnieje ścieżka w grafie z do o wadze gdzie to odpowiednio liczby wierzchołków spoza odwiedzanych przez ścieżkę od do oraz przez ścieżkę od do natomiast to rozmiar bloku Istotnie, z do przechodzimy krawędziami (1), następnie z do przechodzimy krawędziami (2) o łącznej wadze i ostatecznie (jeśli ) używamy krawędzi (3) o wadze aby dostać się z do W ten sposób konstruujemy ścieżkę w która odwiedza wszystkie bloki i ma wagę równą
Tak więc dowiedliśmy, że aby znaleźć rozwiązanie, wystarczy, że wyznaczymy najlżejszą ścieżkę z do w grafie Możemy to zrobić algorytmem Dijkstry, na bieżąco konstruując graf Za każdym razem, gdy z kolejki priorytetowej wyciągamy wierzchołek przechodzimy po liście sąsiedztwa w i relaksujemy krawędzie (1), następnie przechodzimy po liście sąsiedztwa w grafie transponowanym i relaksujemy krawędzie (2); w końcu sprawdzamy, czy i jeśli tak, relaksujemy krawędź (3).
Graf ma wierzchołków. Każdy z nich jest początkiem krawędzi (1) i (2) i co najwyżej jednej krawędzi (3), zatem w mamy krawędzi. Ponadto uaktualnienie wagi wierzchołka podczas relaksacji będzie wykonywane tylko razy, gdyż krawędzie wchodzące do każdego wierzchołka w mają co najwyżej trzy różne wagi. Zatem złożoność czasowa rozwiązania wyniesie Tyle też będzie trwało obliczenie długości najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w jeśli użyjemy do tego algorytmu Floyda–Warshalla.