Advertisement
Guest User

106. Точки сочленения

a guest
Nov 21st, 2017
466
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int n,m;
  6. vector<vector<int> > g;
  7. vector<int> tin,fup;
  8. vector<char> used;
  9. int timer=0;
  10.  
  11. vector<int> c;
  12.  
  13. void is_cutpoint(int v) {
  14.     c.push_back(v);
  15. }
  16.  
  17. void dfs(int v,int p=-1) {
  18.     used[v]=true;
  19.     tin[v]=fup[v]=timer++;
  20.     int children=0;
  21.     for (int i=0;i<(int)g[v].size();++i) {
  22.         int to=g[v][i];
  23.         if (to==p) continue;
  24.         if (used[to]) {
  25.             fup[v]=min(fup[v],tin[to]);
  26.         } else {
  27.             dfs(to,v);
  28.             fup[v]=min(fup[v],fup[to]);
  29.             if (fup[to]>=tin[v] && p!=-1)
  30.                 is_cutpoint(v);
  31.             ++children;
  32.         }
  33.     }
  34.     if (p==-1 && children>1)
  35.         is_cutpoint(v);
  36. }
  37.  
  38. int main(int argc, char **argv)
  39. {
  40.     cin >> n >> m;
  41.     g.resize(n);
  42.     used.resize(n,false);
  43.     tin.resize(n),fup.resize(n);
  44.     for (int i=0;i<m;++i) {
  45.         int u,v;
  46.         cin >> u >> v;
  47.         --u,--v;
  48.         g[u].push_back(v);
  49.         g[v].push_back(u);
  50.     }
  51.    
  52.     dfs(0);
  53.    
  54.     sort(c.begin(),c.end());
  55.    
  56.     cout << (int)c.size() << endl;
  57.     for (int i=0;i<(int)c.size();++i)
  58.         cout << c[i]+1 << " ";
  59.    
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement