Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Metro

Bartosz Łukasiewicz

o artykule ...

  • Publikacja w Delcie: styczeń 2018
  • Publikacja elektroniczna: 1 stycznia 2018
  • Wersja do druku [application/pdf]: (52 KB)

Tym razem omówimy rozwiązanie zadania Metro z I etapu XI Olimpiady Informatycznej Gimnazjalistów w roku szkolnym 2016/2017.

Zadanie. Danych jest n stacji metra, ponumerowanych liczbami naturalnymi od 1 do |n. Każda stacja jest opisana parą współrzędnych |(xi,yi). Wiemy, że pomiędzy każdą parą stacji o tej samej pierwszej lub drugiej współrzędnej istnieje dwukierunkowa linia metra. W zadaniu należy odpowiedzieć na |t zapytań postaci: Czy pomiędzy stacjami a i b można przejechać metrem? Zakładamy, że pasażerowie mogą przesiadać się dowolną liczbę razy.

Zacznijmy od zbudowania grafu |G = (V ,E). Niech wierzchołki grafu reprezentują stacje metra, zaś krawędzie - połączenia pomiędzy tymi stacjami, które mają przynajmniej jedną wspólną współrzędną. Podzielimy graf na spójne składowe (dalej zwane skrótowo spójnymi), to znaczy na części, w których między każdą parą wierzchołków istnieje ścieżka.

Spójne składowe. Wyznaczenie spójnych składowych jest znanym problemem. Naszym celem jest tak poprzydzielać numery wierzchołkom, aby wierzchołki w tej samej spójnej miały ten sam numer, zaś wierzchołki w różnych spójnych miały różne numery. Ustalmy, że numerem spójnej będzie najmniejszy numer wierzchołka należącego do tej spójnej. Aby każdemu wierzchołkowi przydzielić numer spójnej, do której należy, wystarczy przeglądać wierzchołki w rosnącej kolejności numerów. Jeśli rozpatrywany wierzchołek nie ma jeszcze przypisanej spójnej, wówczas temu wierzchołkowi oraz wszystkim wierzchołkom z niego osiągalnych przypisujemy jego numer. Znalezienie wierzchołków osiągalnych może zostać zrealizowane np. algorytmem przeszukiwania w głąb (DFS) lub algorytmem przeszukiwania wszerz (BFS). Złożoność czasowa algorytmu wynosi 𝒪( V + E ).

obrazek

Po wyznaczeniu spójnych składowych odpowiadanie na zapytania, czy ze stacji |a istnieje połączenie do stacji |b, można zrealizować w czasie stałym. Wystarczy sprawdzić, czy oba wierzchołki należą do tej samej spójnej składowej.

Zastanówmy się teraz, jaka jest złożoność całego rozwiązania. Pesymistycznie liczba krawędzi może być rzędu  2 𝒪(n ) (np. w przypadku, gdy wszystkie stacje mają pierwszą współrzędną równą 1, wówczas liczba krawędzi wynosi |n(n −1)/2 ). Niestety, dla limitów z treści zadania takie rozwiązanie nie otrzyma maksymalnej liczby punktów.

Okazuje się, że możemy zredukować rozmiar naszego grafu. Rozpatrzmy rzędną y oraz położone na niej stacje s,s ,...,s 1 2 k o współrzędnych |(xs1,y),(xs2,y), ...,(xsk,y), gdzie |xs1 < xs2 < ... < xsk. Zauważmy, że pomiędzy każdą parą tych stacji można przejechać, ponieważ mają wspólną drugą współrzędną.

obrazek

Zauważmy, że nie ma konieczności dodawania do grafu połączeń pomiędzy każdą parą stacji (tych połączeń byłoby |k k−1- 2 ). Wystarczy, że uwzględnimy wyłącznie krawędzie pomiędzy sąsiednimi stacjami, tzn. |(s1,s2),(s2,s3),...,(sk−1,sk). Tych krawędzi jest już tylko k − 1.

obrazek

Jeśli chcemy przejechać ze stacji |s i do stacji |s, j możemy skorzystać ze stacji pośrednich si,si+1,...,s j− 1,s j. Analogiczną redukcję wykonujemy dla osi odciętych. Wówczas otrzymujemy graf, którego liczba krawędzi nie przekracza liczby wierzchołków.

Aby zbudować graf opisany powyżej, należy najpierw posortować wszystkie stacje według drugiej współrzędnej. Wówczas stacje, które mają tę samą drugą współrzędną, będą tworzyły spójny fragment. Każdy z tych fragmentów (stacji o tej samej drugiej współrzędnej) sortujemy względem pierwszej współrzędnej. Wtedy sąsiednie stacje w każdym z tych fragmentów łączymy krawędzią. Analogicznie wyznaczamy połączenie pomiędzy stacjami, które mają tę samą pierwszą współrzędną. Jedyna różnica polega na tym, że najpierw sortujemy względem pierwszej współrzędnej, a potem względem drugiej. Koszt tych operacji wynosi |𝒪(n log(n)).

Podsumowanie. Najpierw budujemy graf, gdzie wierzchołki reprezentują stacje, zaś krawędzie - połączenia pomiędzy sąsiednimi stacjami, znajdującymi się na tej samej odciętej lub rzędnej. Koszt budowy grafu wynosi 𝒪(n log(n)). Następnie wyznaczamy spójne składowe w czasie |𝒪(n). Na koniec odpowiadamy na każde z kolejnych zapytań w czasie stałym. Łączny koszt rozwiązania to |𝒪(n log(n) + t).