Egzamin poprawkowy 2015/16 (18.02.2016)#
Zadanie 1 [20 punktów]#
W tym zadaniu rozważamy grafy, które można przedstawić na płaszczyźnie jako wielokąty wypukły zawierająca maksymalną liczbę nieprzecinających się przekątnych. Takie grafy nazywamy wielokątowymi. Wierzchołkom grafu wielokątowego odpowiadają wierzchołki wielokąta ponumerowane od 1 do n, zgodnie z kolejnością ich występowania na obwodzie. Krawędziom grafu odpowiada n boków i n-3 przekątnych wielokąta. Graf wielokątowy zadajemy przez liczbę n > 2 oraz ciąg 2n-3 par wierzchołków wyznaczających krawędzie grafu. Zakładamy ponadto, że z każdą krawędzią e dana jest całkowitoliczbowa waga w(e).
- [4 punkty] Jaka może być minimalna, a jaka maksymalna wysokość BFS-drzewa w wielokątowym grafie o 2016 wierzchołkach? 
- [5 punktów] Jaka może być minimalna, a jaka maksymalna wysokość DFS-drzewa w wielokątowym grafie o 2016 wierzchołkach? 
- [3 punkty] Rozważmy dowolny, spójny graf z parami różnymi wagami na krawędziach. Udowodnij, że dla każdego wierzchołka, krawędź o minimalnej wadze incydentna z tym wierzchołkiem należy do minimalnego drzewa rozpinającego. 
- [8 punktów] Zaproponuj algorytm, który w czasie liniowym wyznacza minimalne drzewo rozpinające w grafie wielokątowym. 
Zadanie 2 [10 punktów]#
Sortujemy ciągi zero-jedynkowe za pomocą operacji porównania \(\le\) (mniejsze lub równe).
- [5 punktów] Zaproponuj algorytm sortowania ciągu zero-jedynkowego o długości n, optymalny ze względu na porównania \(\le\) (interesuje nas dokładna, pesymistyczna liczba porównań). Udowodnij optymalność swojego algorytmu. 
- [5 punktów] Zaproponuj stabilny algorytm sortowania ciągu zero-jedynkowego o długości n za pomocą n + o(n) porównań \(\le\). 
Zadanie 3 [10 punktów]#
Zaproponuj strukturę danych, które na dynamicznie zmieniającym się ciągu liczbowym umożliwia wydajne wykonywanie następujących operacji:
- Ini(\(\alpha\)):: \(\alpha\) := <> //utwórz pusty ciąg; operacja wykonywania tylko raz, na samym początku 
- Insert(\(\alpha\),a,k):: wstaw a jako k-ty element ciągu, \(1 \le k \le |\alpha|+1\) 
- Delete(\(\alpha\),a,k):: usuń k-ty element ciągu \(\alpha\), \(1 \le k \le |\alpha|\) 
- Sum(\(\alpha\),i,j):: podaj sumę elementów na pozycjach i, i+1,…, j, \(1 \le i \le j \le |\alpha|\) 
- Replace(\(\alpha\),i,j,a):: zamień każdy z elementów z pozycji i, i+1,…, j na a, \(1 \le i \le j \le |\alpha|\)