Egzamin 2016/17 (31.01.2017)#
Zadanie 1 [24 punkty]#
Niech n będzie dodatnia liczbą całkowitą. Grafem Ln nazywamy graf \(({1,2, ..., n}, {i─j: 0 < |i-j| < 3})\).
[3 punkty] Ile jest różnych BFS-drzew w grafie Ln zakorzenionych w wierzchołku 1.
[3 punkty] Ile jest różnych DFS-drzew w grafie L10 zakorzenionych w wierzchołku 1.
Uwaga: dwa drzewa są różne, jeśli istnieje wierzchołek, który w tych drzewach ma różnych ojców.
W podzadaniach (c) i (d) przyjmujemy, że każda krawędź w grafie Ln ma przypisaną całkowitoliczbową wagę.
[8 punktów] Zaprojektuj algorytm, który w czasie liniowym obliczy minimalne drzewo rozpinające w danym grafie Ln.
[10 punktów] Zaprojektuj strukturę danych, która umożliwia efektywne wykonywanie następujących operacji dla dynamicznie modyfikowanych wagach krawędzi w grafie Ln:
Ini:: inicjacja struktury danych dla zadanych początkowo wag (tylko raz);
Zmiana(e,w):: zmień wagę krawędzi e na nową wagę w;
WMDR:: podaj wagę minimalnego drzewa rozpinającego w bieżącym grafie Ln.
Zadanie 2 [8 punktów]#
Gracz ma do dyspozycji planszę w kształcie nieograniczonego pasa podzielonego na kwadratowe pola. Jedno pole wypełnia całą szerokość pasa. Możliwe są następujące posunięcia:
położenie pionka na wskazanym, wolnym polu,
zdjęcie wskazanego pionka i uczynienie pola zajętego przez ten pion wolnym,
wielokrotny skok w prawo (symetrycznie w lewo) od wskazanego pionka.
Pojedynczy skok w prawo odnosi się zawsze do pola zajętego (z pionkiem), dla którego pierwsze pole na prawo jest zajęte, ale następne pole z prawej strony jest puste. Skok polega na ustawieniu nowego pionka na tym pustym polu. Wielokrotny skok w prawo polega na wykonywaniu pojedynczych skoków w prawo tak długo, jak to możliwe, poczynając od wskazanego zajętego pola. Tzn. wykonujemy pojedynczy skok w prawo, następnie pojedynczy skok w prawo od pola, na którym postawiliśmy nowy pionek o ile to możliwe, itd.
Przykład:
Niech O oznacza pole zajęte, a _ pole wolne. Rozważmy pas
_ _ O O O _ O _ O _ O O _
Po wykonaniu wielokrotnego skoku w prawo dla pionka O dostajemy konfigurację
_ _ O O O O O O O O O O _
Dokonaj analizy kosztu zamortyzowanego jednego posunięcia gracza. Za operację elementarną przyjmujemy postawienie lub usunięcie pionka.
Zadanie 3 [8 punktów]#
Zaprojektuj efektywny algorytm, który dla danych słów x, y nad alfabetem {d,i,k,s} obliczy ile różnych słów będących cyklicznymi przesunięciami słowa x jest podsłowami słowa y.
Uwaga: w każdym zadaniu uzasadnij poprawność zaproponowanych rozwiązań i dokonaj analizy złożoności obliczeniowej swoich algorytmów.