Advertisement
Dzham

Untitled

Apr 15th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <set>
  5. #include <climits>
  6. #include <queue>
  7.  
  8.  
  9. class Graph {
  10. int size;
  11. std::vector<std::vector<int>> data;
  12. std::vector<std::vector<int>> merge;
  13. std::vector<std::vector<int>> roads;
  14. std::vector<bool> isused;
  15. std::queue<int> que;
  16. public:
  17. Graph(int n) {
  18. size = n;
  19. data.resize(n);
  20. merge.resize(n);
  21. roads.resize(n);
  22. for (int i = 0; i < n; ++i) {
  23. data[i].resize(n, 2000);
  24. roads[i].resize(n, 0);
  25. }
  26. isused.resize(n, false);
  27. }
  28.  
  29. void insert(int a, int b, int c, int d) {
  30. if (a != b) {
  31. data[a - 1][b - 1] = c;
  32. data[b - 1][a - 1] = c;
  33. roads[a - 1][b - 1] = d;
  34. roads[b - 1][a - 1] = d;
  35. merge[a - 1].push_back(b - 1);
  36. merge[b - 1].push_back(a - 1);
  37. }
  38. }
  39.  
  40. bool shortest_way(int a, int b, int w) {
  41. std::vector<int> result(size, 2000);
  42. result[a - 1] = 0;
  43. std::queue<int> empty;
  44. std::swap(que, empty);
  45. que.push(a - 1);
  46. while (que.size() != 0) {
  47. int vertex = que.front();
  48. que.pop();
  49. for (auto i : merge[vertex]) {
  50. if (result[i] > result[vertex] + data[vertex][i] && roads[vertex][i] >= w) {
  51. result[i] = result[vertex] + data[vertex][i];
  52. que.push(i);
  53. }
  54. }
  55. }
  56. if (result[b - 1] > 1440) {
  57. return false;
  58. } else {
  59. return true;
  60. }
  61. }
  62.  
  63. int bin_search(int left, int right, int a, int b) {
  64. while (left < right - 1) {
  65. int curr = (left + right) / 2;
  66. if (shortest_way(a, b, curr)) {
  67. left = curr;
  68. } else {
  69. right = curr;
  70. }
  71. }
  72. return left;
  73. }
  74.  
  75. int transport(int a, int b) {
  76. int left = 0;
  77. int right = 10000001;
  78. return bin_search(left, right, a, b);
  79. }
  80.  
  81. };
  82.  
  83. int main() {
  84. int n, m;
  85. std::cin >> n >> m;
  86. Graph g(n);
  87. for (int i = 0; i < m; ++i) {
  88. int a, b, c, d;
  89. std::cin >> a >> b >> c >> d;
  90. d = (d - 3000000) / 100;
  91. g.insert(a, b, c, d);
  92. }
  93. std::cout << g.transport(1, n);
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement