HasanRasulov

park.cpp

Jan 11th, 2020
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #include <map>
  2. #include <vector>
  3. #include <utility>
  4. #include <queue>
  5. #include <set>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <climits>
  9.  
  10. std::vector<std::vector<std::pair<double, double>>> adj;
  11. std::vector<long long> d, c;
  12.  
  13. void dijktras(long long s)
  14. {
  15. d[s] = 0;
  16. std::priority_queue<std::pair<double, double>, std::vector<std::pair<double, double>>, std::greater<std::pair<double, double>>> pq;
  17. pq.push({0, s});
  18. while (!pq.empty())
  19. {
  20. long long v = pq.top().second;
  21. long long d_v = pq.top().first;
  22. pq.pop();
  23. if (d[v] != d_v)
  24. continue;
  25. for (auto &edge : adj[v])
  26. {
  27. long long len = edge.second;
  28. long long to = edge.first;
  29.  
  30. if (d[to] > d[v] + len)
  31. {
  32. d[to] = d[v] + len;
  33. pq.push({d[to], to});
  34. }
  35. }
  36. }
  37. }
  38.  
  39. int main()
  40. {
  41.  
  42. long long n, m, f;
  43. std::cin >> n >> m >> f;
  44. adj.resize(n + 1);
  45. d.assign(n + 1, LONG_LONG_MAX);
  46. c.resize(n + 1);
  47. for (size_t i = 1; i <= n; i++)
  48. std::cin >> c[i];
  49.  
  50. while (m--)
  51. {
  52. long long u, v, w;
  53. std::cin >> u >> v >> w;
  54. adj[u].push_back({v, w});
  55. adj[v].push_back({u, w});
  56. }
  57.  
  58. long long k;
  59. std::cin >> k;
  60.  
  61.  
  62.  
  63. dijktras(1);
  64. std::multiset<long long> ml;
  65. std::vector<std::pair<long long, long long>> v;
  66. for (size_t i = 1; i <= n; i++)
  67. v.push_back({d[i], i});
  68. std::sort(v.begin(), v.end());
  69.  
  70. for (size_t i = 0; i < v.size(); i++){
  71.  
  72. int u = v[i].second;
  73. for (int j = 0; j < c[u]; j++)
  74. {
  75. ml.insert(v[i].first);
  76. if (ml.size() == k)
  77. break;
  78. }
  79. if (ml.size() == k)
  80. break;
  81. }
  82. for (auto &u : ml)
  83. std::cout << u + f << " ";
  84. if (k > ml.size())
  85. for (size_t i = 0; i < k - ml.size(); i++)
  86. std::cout << -1 << " ";
  87.  
  88. return EXIT_SUCCESS;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment