Advertisement
Tbl_Mne_Ne_Dryg

Find articulation points

Aug 23rd, 2020
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<vector<pair<int, int>>> g;
  6. vector<bool> used;
  7. vector<int> tin;
  8. vector<int> tup;
  9. int timer = 0;
  10. set<int> ans;
  11. vector<int> cnt;
  12.  
  13. void dfs(int v, int ind) {
  14.     used[v] = 1;
  15.     tin[v] = timer++;
  16.     tup[v] = tin[v];
  17.     int ch = 0;
  18.     for(int i = 0; i < g[v].size(); i++) {
  19.         int to = g[v][i].first;
  20.         if(g[v][i].second == ind) continue;
  21.         if(!used[to]) { // прямое
  22.             dfs(to, g[v][i].second);
  23.             tup[v] = min(tup[v], tup[to]);
  24.             ch++;
  25.             if(tin[v] <= tup[to]) {
  26.                 ans.insert(v);
  27.             }
  28.             cnt[v]++;
  29.         }
  30.         else {  // обратное
  31.             tup[v] = min(tup[v], tin[to]);
  32.         }
  33.     }
  34. }
  35.  
  36. int main() {
  37.     int n, m;
  38.     cin >> n >> m;
  39.     g.resize(n);
  40.     tin.resize(n);
  41.     tup.resize(n);
  42.     used.resize(n);
  43.     cnt.resize(n);
  44.     for(int i = 0; i < m; i++) {
  45.         int a, b;
  46.         cin >> a >> b;
  47.         if(a > b) {
  48.             swap(a, b);
  49.         }
  50.         a--;
  51.         b--;
  52.         g[a].push_back({b, i});
  53.         g[b].push_back({a, i});
  54.     }
  55.     for(int i = 0; i < n; i++) {
  56.         if(!used[i]) {
  57.             dfs(i, i);
  58.         }
  59.     }
  60.     cout << ans.size() - (cnt[0] < 2) << '\n';
  61.     for(auto i : ans) {
  62.         if(i == 0 && cnt[0] < 2) continue;
  63.         cout << i + 1 << ' ';
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement