Advertisement
gertsog

Chefir

Nov 9th, 2019
635
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1.     #include <iostream>
  2.     #include <vector>
  3.     #include <set>
  4.     #include <climits>
  5.     #include <algorithm>
  6.      
  7.     #define ULLONG unsigned long long
  8.     constexpr auto INF = ULLONG_MAX;
  9.     typedef std::pair<ULLONG, int> edge;
  10.      
  11.     std::vector<std::vector<edge>> G;
  12.      
  13.     template <class type>
  14.     std::ostream& operator<<( std::ostream &Out, const std::vector<type> &Vec )
  15.     {
  16.       for (auto & a : Vec)
  17.         Out << a << " ";
  18.       return Out;
  19.     }
  20.      
  21.     std::pair<ULLONG, ULLONG> dijkstra( int S, int b, int c )
  22.     {
  23.       const int n = G.size();
  24.      
  25.       std::vector<ULLONG> d(n, INF);
  26.       std::set<edge> que;
  27.      
  28.       d[S] = 0;
  29.       que.insert(edge(d[S], S));
  30.      
  31.       while (!que.empty())
  32.       {
  33.         int v = que.begin()->second;
  34.      
  35.         que.erase(que.begin());
  36.      
  37.         // relax
  38.         for (auto & to : G[v])
  39.           if (d[v] + to.first < d[to.second])
  40.             que.erase(edge(d[to.second], to.second)), que.insert(edge((d[to.second] = d[v] + to.first), to.second));
  41.       }
  42.      
  43.       return std::pair<ULLONG, ULLONG>(d[b], d[c]);
  44.     }
  45.      
  46.     int main()
  47.     {
  48.       int n, m, a, b, c;
  49.       ULLONG w1, w2, w3;
  50.      
  51.       scanf("%i%i", &n, &m);
  52.      
  53.       G.resize(n);
  54.      
  55.       while (m--)
  56.         scanf("%i%i%llu", &a, &b, &w1), G[--a].push_back(edge(w1, --b)), G[b].push_back(edge(w1, a));
  57.      
  58.       scanf("%i%i%i", &a, &b, &c);
  59.      
  60.       a--, b--, c--;
  61.      
  62.       auto
  63.         res1 = dijkstra(a, b, c),
  64.         res2 = dijkstra(b, a, c);
  65.      
  66.       w1 = res1.first, w2 = res1.second, w3 = res2.second;
  67.      
  68.       if (w2 != INF && w1 != INF && w3 != INF)
  69.       {
  70.         ULLONG res = 0;
  71.      
  72.         if (w1 < w2)
  73.         {
  74.           if (w1 < w3)
  75.             res = w1 + std::min(w2, w3);
  76.           else
  77.             res = w3 + w1;
  78.         }
  79.         else // w2 <= w1
  80.         {
  81.           if (w2 < w3)
  82.             res = w2 + std::min(w3, w1);
  83.           else
  84.             res = w3 + w2;
  85.         }
  86.      
  87.         printf("%llu", res);
  88.       }
  89.       else
  90.         printf("-1");
  91.      
  92.       return 0;
  93.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement