Nik_Perepelov

7 контест 1, 2 задача Даша

Nov 3rd, 2021 (edited)
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. vector<vector<int>> g(20000);
  7. vector<vector<int>> g_reversed(20000);
  8. vector<int> used(20000);
  9. vector<int> order;
  10. vector<int> componenta;
  11.  
  12. void dfs(int v){
  13.     used[v] = 1;
  14.     for (int i = 0; i < g[v].size(); i++){
  15.         int curr_v = g[v][i];
  16.         if (used[curr_v] == 0)
  17.             dfs(curr_v);
  18.     }
  19.     order.push_back(v);
  20. }
  21.  
  22. void dfs_reversed(int v){
  23.     used[v] = 1;
  24.     componenta.push_back(v);
  25.     for (int i = 0; i < g_reversed[v].size(); i++){
  26.         int curr_v = g_reversed[v][i];
  27.         if (used[curr_v] == 0)
  28.             dfs_reversed(curr_v);
  29.     }
  30. }
  31.  
  32. int main() {
  33.     int n, m;
  34.     cin >> n >> m;
  35.     for (int i = 0; i < m; i++){
  36.         int a, b;
  37.         cin >> a >> b;
  38.         g[a - 1].push_back(b - 1);
  39.         g_reversed[b - 1].push_back(a - 1);
  40.     }
  41.  
  42.     for (int i = 0; i < n; i++){
  43.         if (used[i] == 0)
  44.             dfs(i);
  45.     }
  46.  
  47.     for (int i = 0; i < n; i++)
  48.         used[i] = 0;
  49.  
  50.     int k = 1;
  51.     vector<int> res(n);
  52.     for (int i = 0; i < n; i++){
  53.         int curr_v = order[n - i - 1];
  54.         if (used[curr_v] == 0){
  55.             dfs_reversed(curr_v);
  56.             for (int j = 0; j < componenta.size(); j++){
  57.                 res[componenta[j]] = k;
  58.             }
  59.             k++;
  60.             componenta.clear();
  61.         }
  62.     }
  63.     cout << k - 1 << endl;
  64.     for (int i = 0; i < n; i++){
  65.         cout << res[i] << ' ';
  66.     }
  67. }
  68.  
  69. // 2 задача
  70.  
  71. #include <iostream>
  72. #include <vector>
  73.  
  74. using namespace std;
  75.  
  76. vector<vector<int>> g(20000);
  77. vector<vector<int>> g_reversed(20000);
  78. vector<int> used(20000);
  79. vector<int> order;
  80. vector<int> componenta;
  81.  
  82. void dfs(int v){
  83.     used[v] = 1;
  84.     for (int i = 0; i < g[v].size(); i++){
  85.         int curr_v = g[v][i];
  86.         if (used[curr_v] == 0)
  87.             dfs(curr_v);
  88.     }
  89.     order.push_back(v);
  90. }
  91.  
  92. void dfs_reversed(int v){
  93.     used[v] = 1;
  94.     componenta.push_back(v);
  95.     for (int i = 0; i < g_reversed[v].size(); i++){
  96.         int curr_v = g_reversed[v][i];
  97.         if (used[curr_v] == 0)
  98.             dfs_reversed(curr_v);
  99.     }
  100. }
  101.  
  102. int main() {
  103.     int n, m;
  104.     cin >> n >> m;
  105.     for (int i = 0; i < m; i++){
  106.         int a, b;
  107.         cin >> a >> b;
  108.         g[a - 1].push_back(b - 1);
  109.         g_reversed[b - 1].push_back(a - 1);
  110.     }
  111.  
  112.     for (int i = 0; i < n; i++){
  113.         if (used[i] == 0)
  114.             dfs(i);
  115.     }
  116.  
  117.     for (int i = 0; i < n; i++)
  118.         used[i] = 0;
  119.  
  120.     int k = 1;
  121.     vector<int> componenta_number(n);
  122.     vector<int> componenta_v;
  123.     for (int i = 0; i < n; i++){
  124.         int curr_v = order[n - i - 1];
  125.         if (used[curr_v] == 0){
  126.             dfs_reversed(curr_v);
  127.             for (int j = 0; j < componenta.size(); j++){
  128.                 componenta_number[componenta[j]] = k;
  129.             }
  130.             componenta_v.push_back(componenta[0]);
  131.             k++;
  132.             componenta.clear();
  133.         }
  134.     }
  135.     vector<int> f_is(k - 1); // 1 - пожарную станцию размещать не надо
  136.  
  137.     int cnt = k;
  138.     for (int i = 0; i < n; i++){
  139.         for (int j = 0; j < g[i].size(); j++){
  140.             int a = i;
  141.             int b = g[i][j];
  142.             if (componenta_number[a] != componenta_number[b]){
  143.                 f_is[componenta_number[a] - 1] = 1;
  144.                 cnt--;
  145.             }
  146.         }
  147.     }
  148.     cout << cnt << endl;
  149.     for (int i = 0; i < k - 1; i++){
  150.         if (f_is[i] == 0)
  151.             cout << componenta_v[i] + 1 << endl;
  152.     }
  153. }
Add Comment
Please, Sign In to add comment