Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Trasowanie

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: czerwiec 2014
  • Publikacja elektroniczna: 02-06-2014
  • Wersja do druku [application/pdf]: (104 KB)

Tym razem zajmiemy się zadaniem Routing z finałów Akademickich Mistrzostw Świata w Programowaniu Zespołowym z 2006 roku...

obrazek

Rys. 1 Optymalne rozwiązanie dla powyższego grafu to math i math Ścieżki przechodzą łącznie przez 6 wierzchołków.

Rys. 1 Optymalne rozwiązanie dla powyższego grafu to math i math Ścieżki przechodzą łącznie przez 6 wierzchołków.

Po przetłumaczeniu historyjki o sieci komputerowej na język teorii grafów brzmi ono następująco. Dany jest skierowany graf math  mający math wierzchołków, z których wyróżniamy początkowy  math i końcowy  math Chcemy znaleźć w grafie  math  dwie skierowane ścieżki math i  math (pierwszą z  math do  math a drugą z  math do  math) 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  math dla pierwszej z nich zgodnie ze skierowaniem krawędzi, a dla drugiej – przeciwnie. Zdefiniujmy w tym celu ważony graf skierowany math  w którym z wierzchołka math wychodzą krawędzie:

(1)
(1) do math o wadze math jeśli math
(2)
(2) do math o wadze math jeśli math
(3)
(3) do math o wadze math jeśli w  math  istnieje skierowana ścieżka z  math do  math i najkrótsza taka ścieżka zawiera math krawędzi.

Krawędzie (1) i (2) w  math  odpowiadają przesuwaniu się ścieżką  math w  math  zgodnie ze skierowaniem krawędzi i ścieżką  math przeciwnie do skierowania krawędzi. Natomiast krawędź (3) w  math  odpowiada przesunięciu się obiema ścieżkami po tych samych krawędziach w  math  Łatwo się więc przekonać, że jeżeli w  math  istnieje ścieżka z  math do  math o wadze  math  to oznacza, że w  math  istnieją dwie ścieżki, pierwsza z  math do  math i druga z  math do  math takie że sumaryczna liczba wierzchołków, przez jakie przechodzą (nie licząc math i  math), jest równa co najwyżej  math  W szczególności, ścieżka w  math  z  math do  math o wadze  math  implikuje istnienie rozwiązania zadania o koszcie  math

Pozostaje nam wykazać, że jeśli w optymalnym rozwiązaniu ścieżki math i  math przechodzą przez math  wierzchołków, to w grafie  math  istnieje ścieżka z  math do  math o wadze  math  Niech math 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  math Powiemy, że wierzchołki math tworzą blok, jeśli są one odwiedzane w tej kolejności również przez ścieżkę  math (oznaczymy to przez math). Zauważmy, że z optymalności ścieżek math i  math wynika, że na każdej ze ścieżek między wierzchołkami należącymi do tego samego bloku nie występują wierzchołki spoza  math  Podobny argument dowodzi tego, że jeśli ścieżka  math odwiedza wierzchołek  math jako najbliższy wierzchołek z  math  po wierzchołku  math  to math  Jeśli więc math  podzielimy na maksymalne bloki w kolejności ich odwiedzania przez ścieżkę  math to ścieżka  math będzie je odwiedzać w odwrotnej kolejności. Ponadto pierwszy i ostatni blok podziału będą to odpowiednio math i  math

obrazek

Rys. 2

Rys. 2

Pokażemy (Rys. 2), że dla kolejnych dwóch bloków math i  math tego podziału istnieje ścieżka w grafie  math  z  math do  math o wadze math  gdzie math   math  to odpowiednio liczby wierzchołków spoza  math  odwiedzanych przez ścieżkę  math  od  math  do  math  oraz przez ścieżkę  math od  math do  math natomiast math to rozmiar bloku math Istotnie, z  math do  math przechodzimy math  krawędziami (1), następnie z  math do  math przechodzimy math  krawędziami (2) o łącznej wadze math  i ostatecznie (jeśli math) używamy krawędzi (3) o wadze math aby dostać się z  math do  math W ten sposób konstruujemy ścieżkę w  math  która odwiedza wszystkie bloki i ma wagę równą  math

obrazek

Tak więc dowiedliśmy, że aby znaleźć rozwiązanie, wystarczy, że wyznaczymy najlżejszą ścieżkę z  math do  math w grafie  math  Możemy to zrobić algorytmem Dijkstry, na bieżąco konstruując graf  math  Za każdym razem, gdy z kolejki priorytetowej wyciągamy wierzchołek math przechodzimy po liście sąsiedztwa math w  math  i relaksujemy krawędzie (1), następnie przechodzimy po liście sąsiedztwa  math w grafie transponowanym  math  i relaksujemy krawędzie (2); w końcu sprawdzamy, czy math i jeśli tak, relaksujemy krawędź (3).

Graf math  ma math  wierzchołków. Każdy z nich jest początkiem math  krawędzi (1) i (2) i co najwyżej jednej krawędzi (3), zatem w  math  mamy math  krawędzi. Ponadto uaktualnienie wagi wierzchołka podczas relaksacji będzie wykonywane tylko math  razy, gdyż krawędzie wchodzące do każdego wierzchołka w  math  mają co najwyżej trzy różne wagi. Zatem złożoność czasowa rozwiązania wyniesie math  Tyle też będzie trwało obliczenie długości najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w  math  jeśli użyjemy do tego algorytmu Floyda–Warshalla.