18.10: "Zastosowania przeszukiwania w glab" 1. Zadanie rozgrzewkowe: do grafu pustego dodajemy krawedzie skierowane. Podac moment, w ktorym po raz pierwszy pojawia sie w grafie cykl. Rozwiazanie W zlozonosci O((n+m)*log(m)) z uzyciem wyszukiwania binarnego i przeszukiwania grafu. 2. Sortowanie topologiczne DAG-u metoda iteracyjnego usuwania wierzcholkow o stopniu wyjsciowym 0 oraz metoda wypisywania wierzcholkow w kolejnosci przetworzenia przez algorytm DFS - oba w zlozonosci O(n+m). Kolejnosc pre-order i post-order. 3. Pojecie silnej spojnosci grafu, podzial grafu na silnie spojne skladowe w zlozonosci O(n+m). 4. Konstrukcja grafu silnie spojnych skladowych - usuwanie powtorzen krawedzi z grafu w zlozonosci O(n+m). 5. Graf silnie spojnych skladowych jest DAG-iem. Wyznaczanie najdluzszej i najkrotszej sciezki w DAG-u w zlozonosci O(n+m). 6. Rozwiazanie zadania Profesor Szu z 1 etapu XIII Olimpiady Informatycznej za pomoca podzialu grafu na silnie spojne skladowe i programowania dynamicznego w DAG-u. Wiekszosc algorytmow mozna znalezc w Cormenie. 25.10 "Drzewo przedzialowe": 1. Rozszerzony algorytm Euklidesa, wyznaczajacy dla x oraz y takie p i q calkowite, ze px+qy=NWD(x,y). 2. Zadanie rozgrzewkowe: zadanie Generis z I Internetowych Mistrzostw Polski w Programowaniu za pomoca rozwiazania rownania ax+by=c (a,x,b,y,c naturalne, zmiennymi sa x oraz y). Algorytm rozwiazania tego rownania, dowod kompletnosci skonstruowanych rozwiazan (pkt. 1 i 2 - patrz "Teoria liczb" Sierpinskiego lub Konkretna). 3. Statyczne drzewo przedzialowe, jego wlasciwosci i reprezentacja w tablicy. 4. Rozklad przedzialu na przedzialy bazowe w drzewie przedzialowym w O(log(n)). 5. Rozwiazanie problemu obslugiwania operacji w O(log(n)): dodawania pewnej wartosci do wszystkich liczb z przedzialu i zapytania o wartosc punktu za pomoca drzewa przedzialowego (pkt 3-5: patrz opis rozwiazania zadania Koleje z 1 etapu IX OI lub zadania Tetris 3D z 1 etapu XIII OI). 6. Rozwiazanie wolniejsze od 5, ale latwiejsze do wymyslenia - w O(sqrt(n)). Dzielimy przedzial na O(sqrt(n)) przedzialow wielkosci O(sqrt(n)) (patrz kurs algorytmiki na www.main.edu.pl). 08.11 "Szybkie potegowanie macierzy": 1. Rozwiazanie zadania Tetris 2D (2-wymiarowej wersji zadania z 1 etapu XIII OI) za pomoca drzewa przedzialowego (patrz moj opis w Niebieskiej Ksiazeczce XIII OI). 2. Macierze, mnozenie macierzy, jego lacznosc i brak przemiennosci. 3. Szybkie potegowanie liczb (liczenie an) w zlozonosci O(log(n)). 4. Liczenie n-tego wyrazu ciagu Fibonacciego w O(log(n)) za pomoca szybkiego potegowania macierzy. 5. Ogolny algorytm wyznaczania n-tego wyrazu ciagu zdefiniowanego rekurencyjnie (an zalezy od k poprzednich wartosci) z wykorzystaniem szybkiego potegowania macierzy w zlozonosci O(k3log(n)). 6. Zastosowanie potegowania macierzy do wyznaczania liczby sciezek dlugosci k w grafie miedzy kazda para wierzcholkow w zlozonosci O(n3log(k)). 7. Szkic rozwiazania zadania Mrowka z Potyczek Algorytmicznych 2006 za pomoca metody z pkt. 6.