###### tags: `xivlo` # Zajęcia 29.03.2021 ## Sugerowana kolejność zadań z listy IX 1. Prywatyzacja autostrad 2. A Ty jak szybko piszesz Dijkstrę? * 3. Królestwo Kernali / Najazd Turystów * 4. Bug (A - runda druga) \* Uwaga na duże liczby! ## Algorytm Dijkstry ``` Mamy tablice odwiedzonych (vis), odległości (d) [i poprzedników (prev)]* Mamy tablicę vectorów par - tablica sąsiedztwa z odległościami Dijkstra(start): Zadeklaruj: kolejka priorytetowa par Q Dla każdego wierzchołka v w G wykonaj d[v] := nieskończoność [prev[v] := -1]* d[start] := 0 Dodaj parę {0, start} do Q Dopóki Q niepuste wykonaj v := zdejmij pierwszy wierzchołek w Q Jeżeli v odwiedzone: kontunuuj (continue) vis[v] := true Dla każdego wierzchołka s (sąsiada v) wykonaj Jeżeli d[s] > d[v] + odl(v, s) to d[s] := d[v] + odl(v, s) [prev[v] := u]* Dodaj parę {-d[s], s} do Q ``` \* Niepotrzebne w implementacji, którą nie obchodzi odtworzenie drogi powrotnej ### Uwagi techniczne #### Kolejka priorytetowa ```cpp= #include <queue> //... priority_queue< pair<int, int> > Q; Q.push({-x, y}); Q.top(); //← pierwsza para w kolejce {o, v} Q.top().second; // ← pierwszy wierzchołek v w kolejce Q.pop(); // usunięcie pierwszej pary z kolejki ``` #### Nieskończoność ```cpp= //int const int INF = 1e9*2; //2 miliardy //long long const long long = 1e18; //unsigned long long const long long = 1e19; // można też za pomocą biblioteki climits #include <climits> const int INF = LONG_MAX; //największa możliwa liczba w (long) int const long long INF = LLONG_MAX; //największa możliwa liczba w long long int const unsigned long long INF = ULLONG_MAX; ``` ## Tablica https://miro.com/app/board/o9J_lMkPhoU=/ <iframe width="768" height="432" src="https://miro.com/app/live-embed/o9J_lMkPhoU=/?moveToViewport=-768,497,1536,749" frameBorder="0" scrolling="no" allowFullScreen></iframe>