Advertisement
Derga

Untitled

Mar 3rd, 2024
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. #include <algorithm>
  2. #include <climits>
  3. #include <iostream>
  4. #include <memory>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. /*
  10. дфс с функцией топ сорта (делает нужный порядок вершин)
  11. - из каждой - прошли и сделали порядок
  12.  
  13. прошли в обратном порядке,
  14. посчитали scc сильной связности (дфс по конденсации графа = по компонентам)
  15. */
  16.  
  17. void Dfs1(int u, vector<vector<int>>& edges, vector<bool>& is_visited, vector<int>& order) {
  18. is_visited[u] = true;
  19. for (int v : edges[u]) {
  20. if (is_visited[v]) continue;
  21. Dfs1(v, edges, is_visited, order);
  22. }
  23. order.push_back(u);
  24. }
  25.  
  26. void Dfs2(int u, vector<vector<int>>& t_edges, vector<bool>& is_visited, vector<int>& component) {
  27. is_visited[u] = true;
  28. component.push_back(u);
  29. for (int v : t_edges[u]) {
  30. if (is_visited[v]) continue;
  31. Dfs2(v, t_edges, is_visited, component);
  32. }
  33. }
  34.  
  35. int main() {
  36. int n, e;
  37. cin >> n >> e;
  38. vector<vector<int>> edges(n);
  39. vector<vector<int>> t_edges(n);
  40.  
  41. for (int i = 0; i < e; ++i) {
  42. int u, v;
  43. cin >> u >> v;
  44. --u;
  45. --v;
  46. edges[u].push_back(v);
  47. t_edges[v].push_back(u);
  48. }
  49.  
  50. vector<int> order;
  51. vector<bool> is_visited(n, false);
  52. for (int u = 0; u < n; ++u) {
  53. if (is_visited[u]) continue;
  54. Dfs1(u, edges, is_visited, order);
  55. }
  56.  
  57. for (int i = 0; i < n; i++) {
  58. is_visited[i] = 0;
  59. }
  60. vector<vector<int>> all_component;
  61. vector<int> component;
  62. reverse(order.begin(), order.end());
  63. for (int i = 0; i < n; i++) {
  64. int u = order[i];
  65. if (is_visited[u]) continue;
  66.  
  67. Dfs2(u, t_edges, is_visited, component);
  68. all_component.push_back(component);
  69. component.clear();
  70. }
  71.  
  72. vector<int> compr(n);
  73. vector<int> min_numbers_houses_from_every_family(n, INT_MAX);
  74. for (int i = 0; i < all_component.size(); ++i) {
  75. for (auto v : all_component[i]) {
  76. compr[v] = i;
  77. }
  78. }
  79.  
  80. return 0;
  81. }
  82. /*
  83. test1
  84. 5 6
  85. 1 4
  86. 1 5
  87. 2 3
  88. 3 2
  89. 4 3
  90. 5 1
  91.  
  92. 3 2
  93. 1 4
  94. 4 2
  95. */
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement