(Wymagania techniczne etc., te co poprzednio, a nowe pojawią się w dodatkowym pliku w dziale materiały niebawem)
Historyjka
(Tym razem historyjka tylko dla chętnych)
Mamy serwisy społecznościowe, a w nich opcję "najkrótsza droga" pokazujące jaka jest najkrótsza "droga" po naszych znajomych i ich znajomych etc. do osoby nam nie znanej. Może być to przydatne do wielu celów: kiedy chcemy wypytać "co to za osoba" przed zatrudnieniem jej, poprosić, żeby ktoś nas z nią poznał albo w tym pomógł (np. w celach "towarzyskich").
Zwykle te serwisy mają ograniczenie, iż podają tylko pierwsza znalezioną drogę.
Jasio chce poznać Małgosię, znalazł jej profil w serwisie społecznościowym, ale droga którą serwis pokazuje prowadzi przez konkurenta Jasia.
Pomóż Jasiowi zdobyć serce Małgosi znajdując wszystkie najkrótsze drogi prowadzące do Małgosi przez każdego z jej znajomych.
Zakładamy że już udało ci się scrawlować potrzebny fragment sieci społecznej, oraz sparsować i przekonwerować na postać czystego grafu, gdzie osoby są zmapowane na wierzchołki 0..n-1, a krawędzie reprezentują połączenia z sieci społecznej.
(Dla żądnych większych emocji historyjka alternatywna: chcemy wykraść świetnego pracownika konkurencji, w tym celu szukamy jak najskuteczniej dojść do niego po jego znajomych… albo coś z CIA itp.)
Problem
Dla danego grafu nieskierowanego nieważonego G i pary wierzchołków start, dest ; dla każdego wierzchołka f połączonego bezpośrednio z dest znajdź wszystkie najkrótsze drogi od start do dest prowadzące przez ten wierzchołek f.
Znalezione ścieżki mają być acykliczne (każdy wierzchołek na ścieżce znajduje się tylko raz).
Specyfikacja wejścia
W pierwszym wierszu oddzielone pojedynczymi spacjami: n m start dest.
-
n - ilość wierzchołków
-
m - ilość krawędzi
-
start - numer początkowego wierzchołka
-
dest - numer docelowego wierzchołka
Wierzchołki numerowane: 0..n-1.
W kolejnych m liniach pary u, v oznaczające krawędź między u, a v.
-
2 =< n =< 10’000’000
-
1 =< m =< 10’000’000
-
start != dest
-
Sumaryczna długość znalezionych ścieżek =< 100’000’000 [porada - patrz limit pamięci - lepiej ich wszystkich nie spamiętywać, a tylko odtwarzać przy wypisywaniu na podstawie poprzedników]
Specyfikacja wyjścia
Znalezione ścieżki, wypisane po jednej w każdym wierszu zgodnie z następującym formatem:
l v1 v2 … vl - pierwsza liczba l to ilość węzłów na ścieżce, potem wypisane l kolejnych wierzchołków na ścieżce poczynając od startowego start a kończąc na docelowym dest.
Liczby całkowite, oddzielone pojedynczą spacją.
Kolejność wierszy dowolna, ale koniecznie liczby całkowite oddzielone pojedynczą spacją, bez białych znaków na początku wiersza, ponieważ wyniki będą porządkowane unix-owym poleceniem sort -u.
Limity
Pesymistyczna złożoność obliczeniowa : O(n+m+k) ; gdzie k to sumaryczna długość znalezionych ścieżek.
Pamięciowa: O(n+m)
Limit pamięci: około 400MB.
Przykłady
n10m15
Obrazek do przykładu w pliku zad4_n10m15.png
Wejście
10 15 2 4 2 1 5 1 0 2 7 4 1 3 0 4 4 6 5 6 7 5 3 6 3 5 3 7 7 6 3 9 9 5
Wyjście
3 2 0 4 5 2 1 3 6 4 5 2 1 3 7 4 5 2 1 5 6 4 5 2 1 5 7 4