割点:
割点是属于无向图中的一种概念,对于割点来说有两种情况。1:如果当前点为根节点,并且,他有两个孩子节点,那么他是一个割点。2:如果当前点不是根节点,但是他的low[v]>=dfn[u],那么他是一个割点
割点的概念:
如果一张连通的图中,存在一点,如果失去这个点,那么这张图将不在连通,那么这个点就是割点
AC代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e6+5;
#define ll long long
int cnt,dfn[maxn],low[maxn];
int head[maxn],tim,ans,vis[maxn];
struct node
{
int to,nex;
} edge[maxn<<1];
void add(int u,int v)
{
edge[cnt]=node{v,head[u]};
head[u]=cnt++;
}
void dfs(int u,int fa)
{
dfn[u]=low[u]=++tim;
int child=0;
for(int i=head[u]; ~i; i=edge[i].nex)
{
int v=edge[i].to;
if(!dfn[v])
{
dfs(v,u);
low[u]=min(low[v],low[u]);
if(u!=fa&&low[v]>=dfn[u])
{
vis[u]=1;
}
if(u==fa)
child++;
}
low[u]=min(dfn[v],low[u]);
}
if(u==fa&&child>1)
{
vis[u]=1;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
memset(head,-1,sizeof(head));
int n,m,u,v;
cin>>n>>m;
rep(i,1,m)
{
cin>>u>>v;
add(u,v);
add(v,u);
}
rep(i,1,n)
{
if(!dfn[i])
{
dfs(i,i);
}
}
rep(i,1,n)
{
if(vis[i])
ans++;
}
cout<<ans<<endl;
rep(i,1,n)
{
if(vis[i])
cout<<i<<' ';
}
cout<<endl;
}