Advertisement
dan_sml

Sem_1_Task_4

Apr 22nd, 2022
974
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. const int maxn = 2e5 + 7;
  5. std::vector <std::vector <int>> gr;
  6. int d[maxn], dp[maxn];
  7. bool used[maxn], is_cutpoint[maxn];
  8.  
  9. void dfs(int v, int p = -1) {
  10.     used[v] = true;
  11.     if (p != -1) d[v] = d[p] + 1;
  12.     dp[v] = d[v];
  13.     int power = 0;
  14.     for (auto u : gr[v]) {
  15.         if (!used[u]) {
  16.             power++;
  17.             dfs(u, v);
  18.             dp[v] = std::min(dp[v], dp[u]);
  19.             if (p != -1 && dp[u] >= d[v]) is_cutpoint[v] = true;
  20.         }
  21.         else if (u != p) {
  22.             dp[v] = std::min(dp[v], d[u]);
  23.         }
  24.     }
  25.     if (p == -1 && power > 1) is_cutpoint[v] = true;
  26. }
  27.  
  28. signed main() {
  29.     int n, m;
  30.     std::cin >> n >> m;
  31.     gr.resize(n + m);
  32.     for (int i = 0; i < m; i++) {
  33.         int u, v, p;
  34.         std::cin >> u >> v >> p;
  35.         u += m - 1;
  36.         v += m - 1;
  37.         p += m - 1;
  38.         gr[u].push_back(i);
  39.         gr[v].push_back(i);
  40.         gr[p].push_back(i);
  41.         gr[i].push_back(u);
  42.         gr[i].push_back(v);
  43.         gr[i].push_back(p);
  44.     }
  45.     dfs(0);
  46.     std::vector<int> ans;
  47.     for (int i = 0; i < m; i++) {
  48.         if (is_cutpoint[i]) ans.push_back(i + 1);
  49.     }
  50.     std::cout << ans.size() << "\n";
  51.     for (auto x : ans) std::cout << x << "\n";
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement