#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e4+5;
const int mod=1e9+7;
vector<int> g[N];
set<int> v;
int dfn[N],low[N],fa[N];
int n,m,tot;
void tarjan(int x){
dfn[x]=low[x]=++tot;
int child=0;
for(int i=0;i< g[x].size();i++){
int y=g[x][i];
if(dfn[y]==0){
child++;
fa[y]=x;
tarjan(y);
if(fa[x]==0&&child>=2){
v.insert(x);
}
else if(fa[x]&&dfn[x]<=low[y]){
v.insert(x);
}
low[x]=min(low[x],low[y]);
}
else if(y!=fa[x]){
low[x]=min(low[x],dfn[y]);
}
}
}
int main(){
std::ios::sync_with_stdio(false);
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]==0){
tarjan(i);
}
}
/*
for(int i=1;i<=n;i++){
cout<<i<<' '<<dfn[i]<<' '<<low[i]<<' '<<fa[i]<<endl;
}
*/
cout<<v.size()<<endl;
for(set<int>::iterator iter = v.begin() ; iter != v.end() ; ++iter){
cout<<*iter<<" ";
}
return 0;
}
trajan割点模板
最新推荐文章于 2021-07-06 10:58:51 发布