Advertisement
Mlxa

ALGO heapDijkstra

Dec 28th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. namespace Mlxa {
  7.     using namespace std;
  8.     typedef   long long         ll;
  9.  
  10.     #define eol                 endl
  11.     template <class A> inline void print(A a) { cout << a << ' '; }
  12.     #define endln               cout << eol
  13.         template <class A>              inline void
  14.     println (A a)               { cout << a << eol; }
  15.         template <class A, class... B>  inline void
  16.     println (A a, B... b)       { print(a); println(b...); }
  17.         template <class It>             void
  18.     printseq (It b, It e)       { for (It i(b); i != e; ++i) cout << *i << ' '; endln; }
  19.     #define read                cin
  20.  
  21.     #define pb                  push_back
  22.     #define mp                  make_pair
  23.     #define all(x)              begin(x), end(x)
  24.     #define size(x)             int(x.size())
  25.  
  26.     #define openFiles(name)     freopen(name ".in", "r", stdin), freopen(name ".out", "w", stdout)
  27.     #define fastIO              ios_base::sync_with_stdio(0), cin.tie(0)  
  28. } using namespace Mlxa;
  29. const int INF(1e8);
  30.  
  31. template <class T>
  32. class Heap {
  33. public:
  34.     vector<T> d;
  35.     vector<int> v;  // vertex by place
  36.     vector<int> w;  // place by vertex
  37.  
  38.     inline void swp (int i, int j) {
  39.         register int temp;
  40.         temp = w[v[i]], w[v[i]] = w[v[j]], w[v[j]] = temp;
  41.         temp = v[i], v[i] = v[j], v[j] = temp;  
  42.     }
  43.  
  44.     void down (register int i) {
  45.         for (register int j(i); i+i+1 < size(v); i = j) {
  46.             int l(i + i + 1), r(l + 1); j = l;
  47.             if (r < size(v) && d[v[r]] < d[v[l]]) j = r;
  48.             if (d[v[j]] < d[v[i]]) swp(i, j);
  49.             else break;
  50.         }
  51.     }
  52.     void up (register int i) {
  53.         for (; d[v[i]] < d[v[(i-1)/2]]; i = (i-1)/2)
  54.             swp(i, (i-1)/2);
  55.     }
  56.     void make () {
  57.         register int i(size(v)>>1);
  58.         while (0 <= i) down(i), -- i;
  59.     }
  60.     int pop () {
  61.         int res = v[0];
  62.         swp(0, size(v) - 1);
  63.         v.pop_back(), down(0);
  64.         return res;
  65.     }
  66.     void relax (int i, const T& to) {
  67.         if (to < d[i]) d[i] = to, up(w[i]);
  68.     }
  69.     Heap (int n) { d.resize(n), v.resize(n), w.resize(n); }
  70.     bool notEmpty () { return !v.empty(); }
  71.     void print() {
  72.         println("HEAP:");
  73.         printseq(all(d));
  74.         printseq(all(v));
  75.         printseq(all(w));
  76.     }
  77. };
  78.  
  79. int n, st, fi; const int maxN(119);
  80. vector< pair<int, int> > G[maxN];
  81.  
  82. void start () {
  83.     //stdin = freopen("in.txt", "r", stdin);
  84.     read >> n >> st >> fi; int tmp;
  85.     for (register int i(0); i < n; ++ i)
  86.         for (int j(0); j < n && read >> tmp; ++ j)
  87.             if (tmp >= 0) G[i].emplace_back(j, tmp);
  88. }
  89.  
  90. int heapDijkstra (int start, int finish) {
  91.     Heap<int> heap(n);
  92.     fill(all(heap.d), +INF); heap.d[start] = 0;
  93.     for (int i(0); i < n; ++ i) heap.w[i] = heap.v[i] = i;
  94.     heap.make();
  95.  
  96.     while (heap.notEmpty()) {
  97.         //heap.print();
  98.         int v = heap.pop(), dv = heap.d[v];
  99.         for (auto pa : G[v])
  100.             heap.relax(pa.first, dv + pa.second);
  101.     }
  102.     return heap.d[finish];
  103. }
  104.  
  105. int main () {
  106.     start();
  107.     int res = heapDijkstra(--st, --fi);
  108.     if (res < +INF) println(res);
  109.     else            println(-1);
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement