Advertisement
AmidamaruZXC

TaskA

Jun 23rd, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. class Edge
  9. {
  10. public:
  11.     int A;
  12.     int B;
  13.     int W;
  14. };
  15.  
  16. using Matrix = vector<vector<int>>;
  17.  
  18. struct Vertex {
  19.     int maxDistEstim = INT32_MAX;
  20.     int index;
  21. };
  22.  
  23. struct Comparator {
  24.     bool operator()(const Vertex* first, const Vertex* second)
  25.     {
  26.         if (first->maxDistEstim == second->maxDistEstim)
  27.             return first->index < second->index;
  28.         else
  29.             return first->maxDistEstim < second->maxDistEstim;
  30.     }
  31. };
  32.  
  33. void solve(int N, int M, vector<Edge>& edges, vector<int>& result)
  34. {
  35.     vector<Vertex> vertices(N);
  36.     for (int i = 0; i < vertices.size(); ++i)
  37.         vertices[i].index = i;
  38.     vertices[0].maxDistEstim = 0;
  39.  
  40.     Matrix relations(N);
  41.     for (vector<int>& vec : relations)
  42.         vec = vector<int>(N);
  43.     for (const Edge& edge : edges)
  44.         relations[edge.A][edge.B] = edge.W;
  45.  
  46.     auto compare = [](const Vertex* first, const Vertex* second) -> bool {
  47.         if (first->maxDistEstim == second->maxDistEstim)
  48.             return first->index < second->index;
  49.         else
  50.             return first->maxDistEstim < second->maxDistEstim;
  51.     };
  52.  
  53.     set<Vertex*, bool (*)(const Vertex* first, const Vertex* second)> set(compare);
  54.     for (Vertex& vertex : vertices)
  55.         set.insert(&vertex);
  56.     while (!set.empty())
  57.     {
  58.         Vertex* v = *set.begin();
  59.         set.erase(v);
  60.         for (int j = 0; j < relations[v->index].size(); ++j)
  61.         {
  62.             if (relations[v->index][j] != 0 && v->maxDistEstim + relations[v->index][j] < vertices[j].maxDistEstim)
  63.             {
  64.                 set.erase(&vertices[j]);
  65.                 vertices[j].maxDistEstim = v->maxDistEstim + relations[v->index][j];
  66.                 set.insert(&vertices[j]);
  67.             }
  68.         }
  69.     }
  70.     for (int i = 1; i < vertices.size(); ++i)
  71.         result.push_back(vertices[i].maxDistEstim);
  72. }
  73.  
  74. int main()
  75. {
  76.     int N, M;
  77.     cin >> N;
  78.     cin >> M;
  79.     vector<Edge> edges;
  80.     for (int i = 0; i < M; i++)
  81.     {
  82.         Edge e;
  83.         cin >> e.A>> e.W >> e.B;
  84.         e.A -= 1;
  85.         e.B -= 1;
  86.         edges.push_back(e);
  87.     }
  88.  
  89.     vector<int> result;
  90.  
  91.     solve(N, M, edges, result);
  92.  
  93.     for (int i = 0; i < result.size(); i++)
  94.         cout << result[i] << " ";
  95.  
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement