Advertisement
Nik_Perepelov

7 контест Насте

Nov 3rd, 2021
952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <list>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. struct Graph {
  9.     int N;
  10.     vector<int> order;
  11.     vector<vector<int>> g;
  12.     vector<vector<int>> g_reversed;
  13.  
  14.     Graph(int V) {
  15.         N = V;
  16.         g = vector<vector<int>>(V);
  17.         g_reversed = vector<vector<int>>(V);
  18.     }
  19.  
  20.     void DFS(int v, vector<bool> &used, stack<int> &s) {
  21.         used[v] = true;
  22.         for (auto i: g[v]) {
  23.             if (!used[i]) {
  24.                 DFS(i, used, s);
  25.             }
  26.         }
  27.         s.push(v);
  28.     }
  29.  
  30.     void DFS_REVERSED(int v, vector<bool> &used) {
  31.         used[v] = true;
  32.         order.push_back(v);
  33.         for (auto i: g_reversed[v]) {
  34.             if (!used[i]) {
  35.                 DFS_REVERSED(i, used);
  36.             }
  37.         }
  38.     }
  39.  
  40.  
  41.     void addEdge(int from, int to) {
  42.         g[from].push_back(to);
  43.         g_reversed[to].push_back(from);
  44.     }
  45.  
  46.     void solve() {
  47.         vector<bool> used(N);
  48.         stack<int> Stack;
  49.         for (int i = 0; i < N; i++) {
  50.             if (!used[i]) {
  51.                 DFS(i, used, Stack);
  52.             }
  53.         }
  54.         used.assign(N, false);
  55.         vector<int> component_for_v(N);
  56.         int count = 0;
  57.         while (!Stack.empty()) {
  58.             int a = Stack.top();
  59.             Stack.pop();
  60.             if (!used[a]) {
  61.                 DFS_REVERSED(a, used);
  62.                 for (auto &i: order) {
  63.                     component_for_v[i] = count + 1;
  64.                 }
  65.                 count++;
  66.                 order.clear();
  67.             }
  68.         }
  69.         cout << count << endl;
  70.         for (auto &i: component_for_v) {
  71.             cout << i << " ";
  72.         }
  73.     }
  74. };
  75.  
  76. int main() {
  77.     int n, m;
  78.     cin >> n >> m;
  79.     Graph g(n);
  80.     for (int i = 0; i < m; ++i) {
  81.         int from, to;
  82.         cin >> from >> to;
  83.         g.addEdge(from - 1, to - 1);
  84.     }
  85.     g.solve();
  86. }
  87. //2
  88.  
  89. #include <iostream>
  90. #include <stack>
  91. #include <vector>
  92.  
  93. using namespace std;
  94.  
  95. struct Graph {
  96.     int N;
  97.     vector<int> order;
  98.     vector<vector<int>> g;
  99.     vector<vector<int>> g_reversed;
  100.  
  101.     Graph(int V) {
  102.         N = V;
  103.         g = vector<vector<int>>(V);
  104.         g_reversed = vector<vector<int>>(V);
  105.     }
  106.  
  107.     void DFS(int v, vector<bool> &used, stack<int> &s) {
  108.         used[v] = true;
  109.         for (auto i: g[v]) {
  110.             if (!used[i]) {
  111.                 DFS(i, used, s);
  112.             }
  113.         }
  114.         s.push(v);
  115.     }
  116.  
  117.     void DFS_REVERSED(int v, vector<bool> &used) {
  118.         used[v] = true;
  119.         order.push_back(v);
  120.         for (auto i: g_reversed[v]) {
  121.             if (!used[i]) {
  122.                 DFS_REVERSED(i, used);
  123.             }
  124.         }
  125.     }
  126.  
  127.  
  128.     void addEdge(int from, int to) {
  129.         g[from].push_back(to);
  130.         g_reversed[to].push_back(from);
  131.     }
  132.  
  133.     void solve() {
  134.         vector<bool> used(N);
  135.         stack<int> Stack;
  136.         for (int i = 0; i < N; i++) {
  137.             if (!used[i]) {
  138.                 DFS(i, used, Stack);
  139.             }
  140.         }
  141.         used.assign(N, false);
  142.         vector<int> component_for_v(N);
  143.         int count = 0;
  144.         while (!Stack.empty()) {
  145.             int a = Stack.top();
  146.             Stack.pop();
  147.             if (!used[a]) {
  148.                 DFS_REVERSED(a, used);
  149.                 for (auto &i: order) {
  150.                     component_for_v[i] = count + 1;
  151.                 }
  152.                 count++;
  153.                 order.clear();
  154.             }
  155.         }
  156.         /*cout << count << endl;
  157.         for (auto &i: component_for_v) {
  158.             cout << i << " ";
  159.         }*/
  160.         vector<bool> isFB(count, true);
  161.  
  162.         for (int i = 0; i < N; i++) {
  163.             for (int j = 0; j < g[i].size(); j++)
  164.             if (component_for_v[i] != component_for_v[g[i][j]]) {
  165.                 isFB[component_for_v[i] - 1] = false;
  166.             }
  167.         }
  168.  
  169.         vector<int> answer;
  170.         for (int i = 0; i < count; i++) {
  171.             if (isFB[i]) {
  172.                 for (int j = 0; j < N; j++) {
  173.                     if (component_for_v[j] == i + 1) {
  174.                         answer.push_back(j);
  175.                     }
  176.                 }
  177.             }
  178.         }
  179.         cout << answer.size() << endl;
  180.         for (int i : answer) {
  181.             cout << i + 1 << endl;
  182.         }
  183.  
  184.     }
  185. };
  186.  
  187. int main() {
  188.     int n, m;
  189.     cin >> n >> m;
  190.     Graph g(n);
  191.     for (int i = 0; i < m; ++i) {
  192.         int from, to;
  193.         cin >> from >> to;
  194.         g.addEdge(from - 1, to - 1);
  195.     }
  196.     g.solve();
  197. }
  198.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement