割点板子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Let_life_stop/article/details/81878213

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e5+5,M=1e5+5,INF=1e9+5;
int n=0,m,u,v;
struct edge
{
    int v,ne;
} e[M<<1];
int h[N],cnt=0;
inline void ins(int u,int v)
{
    cnt++;
    e[cnt].v=v;
    e[cnt].ne=h[u];
    h[u]=cnt;
    cnt++;
    e[cnt].v=u;
    e[cnt].ne=h[v];
    h[v]=cnt;
}
int dfn[N],low[N],dfc=0,iscut[N];
void dfs(int u,int fa)
{
    dfn[u]=low[u]=++dfc;
    int child=0;
    for(int i=h[u]; i; i=e[i].ne)
    {
        int v=e[i].v;
        if(!dfn[v])
        {
            child++;
            dfs(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u]) iscut[u]=1;
        }
        else if(dfn[v]<dfn[u]&&v!=fa) low[u]=min(low[u],dfn[v]);
    }
    if(fa==0&&child==1) iscut[u]=0;
}
int main()
{
    //freopen("D://testdata.in","r",stdin);
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>u>>v;
        ins(u,v);
    }
    for(int i=1; i<=n; i++) if(!dfn[i]) dfs(i,0);

    int ans=0;
    for(int i=1; i<=n; i++) if(iscut[i]) ans++;
    printf("%d\n",ans);
    for(int i=1; i<=n; i++) if(iscut[i]) printf("%d ",i);
}
 

猜你喜欢

转载自blog.csdn.net/Let_life_stop/article/details/81878213