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–