洛谷P3388 【模板】割点(割顶)
#include <iostream>
#include <stack>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
const int maxx= 2e4 + 5 ;
vector< int > G[ maxx] ;
int ans[ maxx] ;
int n, m, dfn[ maxx] , low[ maxx] ;
int cnt= 0 ;
void tarjan ( int x, int root) {
dfn[ x] = low[ x] = ++ cnt;
int c= 0 ;
for ( int i= 0 ; i< G[ x] . size ( ) ; i++ ) {
int v= G[ x] [ i] ;
if ( ! dfn[ v] ) {
c++ ;
tarjan ( v, root) ;
low[ x] = min ( low[ x] , low[ v] ) ;
if ( x!= root&& low[ v] >= dfn[ x] ) {
ans[ x] = 1 ;
}
}
low[ x] = min ( low[ x] , dfn[ v] ) ;
}
if ( c>= 2 && x== root) {
ans[ x] = 1 ;
}
}
int main ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= m; i++ ) {
int x, y;
cin>> x>> y;
G[ x] . push_back ( y) ;
G[ y] . push_back ( x) ;
}
for ( int i= 1 ; i<= n; i++ ) {
if ( ! dfn[ i] ) {
tarjan ( i, i) ;
}
}
int d = 0 ;
for ( int i = 1 ; i <= n; i++ ) {
if ( ans[ i] ) {
d++ ;
}
}
cout << d << endl;
for ( int i = 1 ; i <= n; i++ ) {
if ( ans[ i] ) {
cout << i << " " ;
}
}
cout<< endl;
return 0 ;
}