Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5.  
  6. std::vector<std::vector<int>> graph_to_edges(int n, std::vector<std::vector<int>> graph) {
  7. std::vector<std::vector<int>> edges(n);
  8.  
  9. for (auto i: graph) {
  10. int u = i[0] - 1;
  11. int v = i[1] - 1;
  12.  
  13. edges[u].push_back(v);
  14. edges[v].push_back(u);
  15. }
  16.  
  17. return edges;
  18. }
  19.  
  20.  
  21. std::vector<std::vector<std::pair<int, int>>> weights_graph_to_edges(int n, std::vector<std::vector<int>> graph) {
  22. std::vector<std::vector<std::pair<int, int>>> edges(n);
  23.  
  24. for (auto i: graph) {
  25. int u = i[0] - 1;
  26. int v = i[1] - 1;
  27. int c = i[2];
  28.  
  29. edges[u].emplace_back(v, c);
  30. edges[v].emplace_back(u, c);
  31. }
  32.  
  33. return edges;
  34. }
  35.  
  36.  
  37. std::vector<int> dfs(int n, std::vector<std::vector<int>> graph, int start_vertex) {
  38. std::vector<int> result(n, -1);
  39. std::vector<std::vector<int>> edges(graph_to_edges(n, graph));
  40.  
  41. start_vertex -= 1;
  42.  
  43. std::vector<int> order;
  44. result[start_vertex] = 0;
  45.  
  46. dfs_inner(&order, &result, start_vertex, edges);
  47.  
  48. return result;
  49. }
  50.  
  51.  
  52. void dfs_inner(std::vector<int>* order, std::vector<int>* result, int vertex, const std::vector<std::vector<int>>& edges) {
  53. order->push_back(vertex);
  54.  
  55. for (auto next_vertex: edges[vertex]) {
  56. if ((*result)[next_vertex] == -1) {
  57. (*result)[next_vertex] = order->size();
  58. dfs_inner(order, result, next_vertex, edges);
  59. }
  60. }
  61. }
  62.  
  63.  
  64. std::vector<int> bfs(int n, std::vector<std::vector<int>> graph, int start_vertex) {
  65. std::vector<int> result(n, -1);
  66. std::vector<std::vector<int>> edges(graph_to_edges(n, graph));
  67.  
  68. std::queue<int> vertexes_to_visit;
  69. start_vertex -= 1;
  70. vertexes_to_visit.push(start_vertex);
  71. result[start_vertex] = 0;
  72.  
  73. while (!vertexes_to_visit.empty()) {
  74. int current_vertex = vertexes_to_visit.front();
  75.  
  76. for (auto next_vertex: edges[current_vertex]) {
  77. if (result[next_vertex] != -1) {
  78. continue;
  79. }
  80. vertexes_to_visit.push(next_vertex);
  81. result[next_vertex] = result[current_vertex] + 1;
  82. }
  83. }
  84.  
  85. return result;
  86. }
  87. const int INF = 1000000000;
  88.  
  89. std::vector<int> dijkstra(int n, std::vector<std::vector<int>> graph, int start_vertex) {
  90. std::vector<int> result(n, -1);
  91. std::vector<std::vector<std::pair<int, int>>> edges(weights_graph_to_edges(n, graph));
  92.  
  93. std::vector<int> result(n, INF);
  94. result[start_vertex] = 0;
  95. std::vector<char> u (n);
  96. for (int i = 0; i < n; ++i) {
  97. int v = -1;
  98. for (int j = 0; j < n; ++j)
  99. if (!u[j] && (v == -1 || result[j] < result[v]))
  100. v = j;
  101. if (result[v] == INF)
  102. break;
  103. u[v] = true;
  104.  
  105. for (size_t j = 0; j < edges[v].size(); ++j) {
  106. int to = edges[v][j].first, len = edges[v][j].second;
  107. if (result[v] + len < result[to]) {
  108. result[to] = result[v] + len;
  109. }
  110. }
  111. }
  112.  
  113. return result;
  114. }
  115.  
  116.  
  117. int main() {
  118. std::vector<std::vector<int>> a{{1,2}, {2,3}, {3,4}};
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement