Opracowanie zadań ze SPOJ`a

Transkrypt

Opracowanie zadań ze SPOJ`a
Zadanie XIWTPZH - Podróże pana Jana - podróż dookoła świata
Autor opracowania: Marcin Skiba
Zadanie XIWTPZH - Podróże pana Jana - podróż dookoła świata
Pierwszym poczynionym spostrzeżeniem jest zauważenie grafowej natury zadania.
Przyjmując, że miasta są wierzchołkami grafu, a połączenia lotnicze krawędziami otrzymujemy
graf skierowany. Dodatkowo, zależnie od przewoźnika obsługującego dane połączenie
międzymiastowe, krawędzie mogą przyjąć trzy różne kolory.
W zadaniu wystarczy, że odpowiemy na pytanie: 'Czy w zadanym grafie istnieje
dowolny cykl zawierający krawędzie o co najwyżej dwóch kolorach?' Zwróćmy uwagę na słowa
kluczowe. Chodzi o dowolny cykl, czyli nawet taki:
Lub też taki:
Dodatkowo krawędzie muszą mieć co najwyżej dwa różne kolory. Zauważmy, że nie
musimy szukać jakiegokolwiek cyklu. Wystarczy stwierdzenie, że takowy istnieje. Jak się za to
zabrać?
Zapomnijmy na moment o tym, że krawędzie mają kolory. Przeszukajmy graf w
głąb. Intuicyjnie dochodzimy do wniosku, że jeżeli podczas przeszukiwania grafu w głąb
trafiliśmy do odwiedzonego już wierzchołka to odnaleźliśmy jakiś cykl. Sytuacja taka
przypomina filmowe gubienie się w lesie, kiedy to bohater mówi: 'Chyba już tu byliśmy,
poznaję to drzewo. Kręcimy się w koło.' Tak samo jest w tym przypadku. Jeżeli odwiedziliśmy
wierzchołek, który już był odwiedzony to znaczy, że 'zatoczyliśmy koło', czy też przeszliśmy się
po cyklu (niekoniecznie prostym!).
Co, jeżeli krawędzie mają różne kolory, a my chcemy spełnić warunki zadania? W
moim rozwiązaniu nie ma zbyt głębokiej filozofii. Uruchamiam przeszukiwanie grafu w głąb
trzykrotnie – za każdym razem ignorując krawędzie jednego koloru. W ten sposób jestem w
stanie sprawdzić wszystkie możliwości.
Do opracowania dołączam kod źródłowy napisany w C++ mojego autorstwa (w
osobnym pliku).
–2–

Podobne dokumenty