• POJ 1144 Network(无向图连通分量求割点)


    题目地址:POJ 1144

    求割点。推断一个点是否是割点有两种推断情况:

    假设u为割点,当且仅当满足以下的1条

    1、假设u为树根,那么u必须有多于1棵子树

    2、假设u不为树根。那么(u,v)为树枝边。当Low[v]>=DFN[u]时。

    然后依据这两句来找割点就能够了。

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    int head[200], cnt, index1, ans;
    int vis[200], low[200], dfn[200], ge[200];
    struct node
    {
        int u, v, next;
    }edge[2000];
    void add(int u, int v)
    {
        edge[cnt].v=v;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    }
    void tarjan(int u, int fa)
    {
        int son=0, i;
        low[u]=dfn[u]=++index1;
        vis[u]=1;
        for(i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            son++;
            if(!vis[v])
            {
                tarjan(v,u);
                low[u]=min(low[v],low[u]);
                if(u==1&&son>1||dfn[u]<=low[v]&&u!=1)
                {
                    ge[u]++;
                }
            }
            else if(v!=fa)
                low[u]=min(low[u],dfn[v]);
        }
    }
    void init()
    {
        memset(head,-1,sizeof(head));
        cnt=0;
        index1=ans=0;
        memset(vis,0,sizeof(vis));
        memset(dfn,0,sizeof(dfn));
        memset(ge,0,sizeof(ge));
    }
    int main()
    {
        int n, i, j, u, v;
        while(scanf("%d",&n)!=EOF&&n)
        {
            init();
            while(scanf("%d",&u)!=EOF&&u)
            {
                while(getchar()!='
    ')
                {
                    scanf("%d",&v);
                    add(u,v);
                    add(v,u);
                }
            }
            tarjan(1,-1);
            for(i=1;i<=n;i++)
            {
                if(ge[i])
                    ans++;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    



  • 相关阅读:
    比较@Resource、@Autowired
    Spring boot注解(annotation)含义详解
    Ubuntu进不去,显示error:unknown filesystem (最简单解决方案总结)
    自动更新变成灰色的解决方法
    桌面图标有阴影怎么去掉
    彻底禁止QQ更新
    重命名nginx服务器
    discuz 学习
    Ubuntu 更新源
    鼠标使用技巧 让网页自动向下翻或向上翻
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6809046.html
Copyright © 2020-2023  润新知