割点 模板

#include<cstdio>
using namespace std;
const int maxn=200010;
int head[maxn],nxt[maxn],to[maxn],tt;
int low[maxn],dfn[maxn],index;
int n,m;
bool cut[maxn];
int min(int x,int y)
{
    return x>y?y:x;
}
void add(int u,int v)
{
    to[++tt]=v;
    nxt[tt]=head[u];
    head[u]=tt;
 }
void tarjan(int u,int fa)
{
    dfn[u]=low[u]=++index;
    int col=0;
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(!dfn[v])
        {
            tarjan(v,fa);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u]&&u!=fa)
                cut[u]=1;
            if(u==fa) col++;
        }
        low[u]=min(low[u],dfn[v]);
    }
    if(col>=2&&u==fa) cut[u]=1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
     }
    int ans=0;
    for(int i=1;i<=n;i++) if(dfn[i]==0) tarjan(i,i);
    for(int i=1;i<=n;i++) if(cut[i]) ans++;
    printf("%d\n",ans);
    for(int i=1;i<=n;i++) if(cut[i]) printf("%d ",i);
    return 0; 
 } 

 

posted @ 2021-11-07 22:03  ZeroHzzzz  阅读(6)  评论(0)    收藏  举报  来源