Advertisement
igoryanchik

Dijkstra's

Nov 20th, 2024
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <utility>
  5.  
  6.  
  7. using namespace std;
  8. using vvi = vector<vector<int>>;
  9.  
  10. const int INF = 1e9;
  11. template <class T>
  12. class Heap
  13. {
  14. private:
  15.     T* arr;
  16.     int size;
  17.     int maxSize;
  18.  
  19.     void FilterDown(int cur)
  20.     {
  21.         int curChild = 2 * cur + 1;
  22.  
  23.         while (cur < size)
  24.         {
  25.             curChild = ((curChild + 1 < size) && arr[curChild] < arr[curChild + 1]) ? curChild + 1 : curChild;
  26.             if (arr[curChild] <= arr[cur]) break;
  27.  
  28.             swap(arr[cur], arr[curChild]);
  29.             cur = curChild;
  30.             curChild = 2 * cur + 1;
  31.  
  32.         }
  33.     }
  34.  
  35.     void FilterUp(int cur)
  36.     {
  37.         int parent = (cur - 1) / 2;
  38.  
  39.         while (cur && arr[cur] >= arr[parent])
  40.         {
  41.             swap(arr[cur], arr[parent]);
  42.             cur = parent;
  43.             parent = (cur - 1) / 2;
  44.         }
  45.     }
  46.  
  47.     void HeapBuild()
  48.     {
  49.         int cur = (size - 2) / 2;
  50.  
  51.         while (cur >= 0)
  52.         {
  53.             FilterDown(cur);
  54.             cur--;
  55.         }
  56.  
  57.     }
  58.  
  59. public:
  60.  
  61.     Heap(int _maxSize = 256)
  62.     {
  63.         maxSize = _maxSize;
  64.         size = 0;
  65.         arr = new T[maxSize];
  66.  
  67.         if (arr == 0) throw "MemoryAllocError";
  68.     }
  69.  
  70.     Heap(int _size, int _maxSize = 256)
  71.     {
  72.         size = _size;
  73.         maxSize = _maxSize;
  74.         arr = new T[maxSize];
  75.  
  76.         if (arr == 0) throw "MemoryAllocError";
  77.     }
  78.  
  79.     Heap(T* _arr, int _size, int _maxSize = 256)
  80.     {
  81.         if (_arr == nullptr) throw "Nullptr";
  82.  
  83.         size = _size;
  84.         maxSize = _maxSize;
  85.         arr = new T[maxSize];
  86.  
  87.         if (arr == 0) throw "MemoryAllocError";
  88.  
  89.         for (int i = 0; i < size; ++i)
  90.             Heap<T>::arr[i] = _arr[i];
  91.  
  92.         HeapBuild();
  93.  
  94.  
  95.     }
  96.  
  97.     Heap(const Heap<T>& H)
  98.     {
  99.         if (H.arr == nullptr) throw "Nullptr";
  100.  
  101.         size = H.size;
  102.         maxSize = H.maxSize;
  103.         arr = new T[maxSize];
  104.  
  105.         if (arr == 0) throw "MemoryAllocError";
  106.  
  107.         for (int i = 0; i < size; ++i)
  108.             this->arr[i] = H.arr[i];
  109.  
  110.  
  111.         HeapBuild();
  112.     }
  113.  
  114.     void push(const T& key)
  115.     {
  116.  
  117.         if (!size)
  118.         {
  119.             arr = new T[maxSize];
  120.             if (arr == 0) throw "MemoryAllocError";
  121.         }
  122.  
  123.         if (size == maxSize)
  124.         {
  125.             T* arrBuff = arr;
  126.             arr = new T[maxSize * 2];
  127.  
  128.             if (arr == 0) throw "MemoryAllocError";
  129.  
  130.             for (int i = 0; i < size; ++i)
  131.                 arr[i] = arrBuff[i];
  132.  
  133.             delete[] arrBuff;
  134.         }
  135.  
  136.         size++;
  137.         arr[size - 1] = key;
  138.         FilterUp(size - 1);
  139.     }
  140.  
  141.     void pop()
  142.     {
  143.         arr[0] = arr[size - 1];
  144.         size--;
  145.  
  146.         FilterDown(0);
  147.     }
  148.  
  149.     T top() const
  150.     {
  151.         return arr[0];
  152.     }
  153.  
  154.     bool empty() const
  155.     {
  156.         return (size == 0);
  157.     }
  158.  
  159.     void print() const
  160.     {
  161.         for (int i = 0; i < size; ++i)
  162.             cout << arr[i] << " ";
  163.         cout << '\n';
  164.     }
  165.  
  166.     ~Heap()
  167.     {
  168.         delete[] arr;
  169.     }
  170. };
  171.  
  172. vector<int> dijkstra_with_vector(vvi graph, int start)
  173. {
  174.     int n = graph.size();
  175.     vector<int> dist(n, INF);
  176.     vector<bool> visited(n, 0);
  177.     vector<int> q = { start };
  178.  
  179.     dist[start] = 0;
  180.  
  181.     while (!q.empty())
  182.     {
  183.         int u = q.back();
  184.         q.pop_back();
  185.  
  186.         if (visited[u]) continue;
  187.         visited[u] = 1;
  188.  
  189.         for (int i = 0; i < graph[u].size(); ++i)
  190.         {
  191.             if (graph[u][i] != 0 && (dist[i] == INF || dist[i] > dist[u] + graph[u][i]))
  192.             {
  193.                 dist[i] = dist[u] + graph[u][i];
  194.                 q.push_back(i);
  195.             }
  196.         }
  197.     }
  198.  
  199.     return dist;
  200. }
  201.  
  202. vector<int> dijkstra_with_queue(vvi graph, int start)
  203. {
  204.     priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
  205.     vector<int> dist(graph.size(), INF);
  206.     vector<bool> visited(graph.size(), 0);
  207.  
  208.     q.push({0, start});
  209.     dist[start] = 0;
  210.  
  211.  
  212.     while (!q.empty())
  213.     {
  214.         int u = q.top().second;
  215.         int dist_u = q.top().first;
  216.         q.pop();
  217.  
  218.         if (visited[u]) continue;
  219.         visited[u] = 1;
  220.  
  221.         for (int i = 0; i < graph[u].size(); ++i)
  222.         {
  223.             if (graph[u][i] != 0 && dist[i] > dist_u + graph[u][i])
  224.             {
  225.                 dist[i] = dist_u + graph[u][i];
  226.                 q.push({ dist[i], i });
  227.             }
  228.         }
  229.     }
  230.     return dist;
  231. }
  232.  
  233. vector<int> dijkstra_with_heap(vvi graph, int start)
  234. {
  235.     Heap<pair<int,int>> heap;
  236.     vector<int> dist(graph.size(), INF);
  237.     vector<bool> visited(graph.size(), 0);
  238.  
  239.     dist[start] = 0;
  240.     heap.push({0, start});
  241.  
  242.     while (!heap.empty())
  243.     {
  244.         int u = heap.top().second;
  245.         int dist_u = heap.top().first;
  246.         heap.pop();
  247.  
  248.         if (visited[u]) continue;
  249.         visited[u] = 1;
  250.  
  251.         for (int i = 0; i < graph[u].size(); ++i)
  252.         {
  253.             if (graph[u][i] != 0 &&  dist[i] > dist_u + graph[u][i])
  254.             {
  255.                 dist[i] = dist_u + graph[u][i];
  256.                 heap.push({ dist[i], i });
  257.  
  258.             }
  259.         }
  260.  
  261.     }
  262.  
  263.     return dist;
  264. }
  265.  
  266. int main()
  267. {
  268.     int n;
  269.     cin >> n;
  270.  
  271.     int s, k;
  272.     cin >> s >> k;
  273.     s--; k--;
  274.  
  275.     vector<vector<int>> graph(n, vector<int>(n, 0));
  276.  
  277.     for (int i = 0; i < n; ++i)
  278.         for (int j = 0; j < n; ++j)
  279.             cin >> graph[i][j];
  280.  
  281.  
  282.     vector<int> dist = dijkstra_with_vector(graph, s);
  283.     vector<int> dist2 = dijkstra_with_queue(graph, s);
  284.     vector<int> dist3 = dijkstra_with_heap(graph, s);
  285.  
  286.     cout << dist[k] << ' ' << dist2[k] << ' ' << dist3[k];
  287.  
  288.     return 0;
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement