zoukankan      html  css  js  c++  java
  • Tarjan 割点

    //Tarjan 割点 
    //根节点满足子节点个数>=2即为割点 
    //非根节点满足dfn[u]<=low[v]时u即为割点 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,m,cnt,ans,head[100001];
    int dot,dfn[100001],low[100001];
    int cut[100001];
    struct uio{
        int to,next;
    }edge[200001];
    void add(int x,int y)
    {
        edge[++cnt].next=head[x];
        edge[cnt].to=y;
        head[x]=cnt;
    }
    void tarjan(int x,int fa)
    {
        int child=0;
        dfn[x]=low[x]=++dot;
        for(int i=head[x];i;i=edge[i].next)
        {
            int y=edge[i].to;
            if(!dfn[y])
            {
                tarjan(y,x);
                low[x]=min(low[x],low[y]);
                if(low[y]>=dfn[x]&&x!=fa)
                    cut[x]=1;
                if(x==fa)
                    child++; 
            }
            low[x]=min(low[x],dfn[y]);
        }
        if(child>=2&&x==fa)
            cut[x]=1;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
            add(v,u);
        }
        for(int i=1;i<=n;i++)
            if(!dfn[i])
                tarjan(i,i);
        for(int i=1;i<=n;i++)
            if(cut[i])
                ans++;
        printf("%d
    ",ans);
        for(int i=1;i<=n;i++)
            if(cut[i])
                printf("%d ",i);
         return 0;
    }
  • 相关阅读:
    nginx配置
    线程与进程的区别:
    java面试题1
    递归的定义和优缺点
    使用jedis连接redis可能会出现的问题及解决方案
    Linux上安装Redis
    Linux 权限管理
    Maven
    网址备份
    反射
  • 原文地址:https://www.cnblogs.com/water-radish/p/9280527.html
Copyright © 2011-2022 走看看