Advertisement
Guest User

Untitled

a guest
Jun 25th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. std::vector< std::vector<std::pair<int,long>> > g;
  2.  
  3. std::pair<int, long> deijkstra(int start, int n, int m) {
  4. const int INF = 1000000000;
  5. std::vector<long> d(n + m + 1, INF);
  6. d[start] = 0;
  7. set < pair<int,int> > q;
  8. q.insert(make_pair (d[start], start));
  9. while (!q.empty()) {
  10. int v = q.begin()->second;
  11. q.erase(q.begin());
  12. for (size_t j = 0; j < g[v].size(); ++j) {
  13. int to = g[v][j].first,
  14. len = g[v][j].second;
  15. if (d[v] + len < d[to]) {
  16. q.erase (make_pair (d[to], to));
  17. d[to] = d[v] + len;
  18. p[to] = v;
  19. q.insert(make_pair (d[to], to));
  20. }
  21. }
  22. }
  23. int max_id = start;
  24. long max_val = -1;
  25. for (int i = 1; i <= n + m; ++i) {
  26. if (d[i] != INF && d[i] >= max_val) {
  27. max_val = d[i];
  28. max_id = i;
  29. }
  30. }
  31. return make_pair(max_id, max_val);
  32. }
  33.  
  34. // Complete the cyclicalQueries function below.
  35. vector<long> cyclicalQueries(vector<long> w, int m, int n) {
  36. // Return the list of answers to all queries of type 4. Take the query information from standard input.
  37. vector<long> res;
  38. g.resize(n + m + 1);
  39. for (int i = 1; i <= n; ++i) {
  40. int f = i, t = i + 1;
  41. if (f == n) t = 1;
  42. std::pair<int, long> p1 = std::make_pair(t, w[i-1]);
  43. g[f].push_back(p1);
  44. }
  45. int type, node, weight;
  46. int max_id = n;
  47. for (int i = 0; i < m; ++i) {
  48. cin >> type >> node;
  49. switch (type) {
  50. case 1: {
  51. cin >> weight;
  52. int good_node = deijkstra(node, n, m).first;
  53. max_id++;
  54. std::pair<int, long> p1 = std::make_pair(max_id, weight);
  55. g[good_node].push_back(p1);
  56. break;
  57. }
  58. case 2: {
  59. cin >> weight;
  60. int good_node = node;
  61. max_id++;
  62. std::pair<int, long> p1 = std::make_pair(max_id, weight);
  63. g[good_node].push_back(p1);
  64. break;
  65. }
  66. case 3: {
  67. int good_node = deijkstra(node, n, m).first;
  68. g.erase(g.begin() + good_node);
  69. for (size_t i = 0; i < g.size(); ++i) {
  70. size_t to_del = -1;
  71. for (size_t j = 0; j < g[i].size(); ++j) {
  72. if (g[i][j].first == good_node) to_del = j;
  73. }
  74. if (to_del != -1) {
  75. g[i].erase(g[i].begin() + to_del);
  76. }
  77. }
  78. break;
  79. }
  80. case 4: {
  81. long res_t = deijkstra(node, n, m).second;
  82. res.push_back(res_t);
  83. break;
  84. }
  85. default:
  86. break;
  87. }
  88. }
  89. return res;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement