zoukankan      html  css  js  c++  java
  • 无向图的双连通分量

    大白书模板,图用前向星存储

    int pre[MAXN], iscut[MAXN], bccno[MAXN], dfs_clock, bcc_cnt;
    vector<int> bcc[MAXN];
    
    int edge,head[MAXN];
    struct edgenode
    {
        int to,next;
    } G[MAXM];
    
    void add_edge(int x,int y)
    {
        G[edge].to=y;
        G[edge].next=head[x];
        head[x]=edge++;
    }
    
    struct Edge{
        int u, v;
    };
    
    stack<Edge> S;
    
    int dfs(int u, int fa)
    {
        int lowu=pre[u]=++dfs_clock;
        int child=0;
        for(int i=head[u];i!=-1;i=G[i].next)
        {
            int v=G[i].to;
            Edge e=(Edge){u, v};
            if(!pre[v])
            {
                S.push(e);
                child++;
                int lowv = dfs(v, u);
                lowu = min(lowu, lowv);
                if(lowv>=pre[u])
                {
                    iscut[u]=true;
                    bcc_cnt++;
                    bcc[bcc_cnt].clear();
                    for(;;)
                    {
                        Edge x=S.top(); S.pop();
                        if(bccno[x.u] != bcc_cnt) 
                        {
                            bcc[bcc_cnt].push_back(x.u);
                            bccno[x.u] = bcc_cnt;
                        }
                        if(bccno[x.v] != bcc_cnt) 
                        {
                            bcc[bcc_cnt].push_back(x.v);
                            bccno[x.v] = bcc_cnt;
                        }
                        if(x.u == u && x.v == v) break;
                    }
                }
            } else 
            if(pre[v] < pre[u] && v != fa)
            {
                S.push(e);
                lowu = min(lowu, pre[v]);
            }
        }
        if(fa < 0 && child == 1) iscut[u] = 0;
        return lowu;
    }
    
    void find_bcc(int n)
    {
        memset(pre, 0, sizeof(pre));
        memset(iscut, 0, sizeof(iscut));
        memset(bccno, 0, sizeof(bccno));
        dfs_clock = bcc_cnt = 0;
        for(int i=0; i<n; i++){
            if(!pre[i]) dfs(i, -1);
        }
    }
  • 相关阅读:
    封装了一个简单的筛选菜单控件
    安卓存储资源
    处理webp加所有的jpg到指定路径
    苹果内购
    JavaScript关于md5加密
    JavaScript关于sha1加密
    h5跳转
    python遍历文件(替换)
    python遍历文件
    安卓点击home键重启
  • 原文地址:https://www.cnblogs.com/zhyfzy/p/4415602.html
Copyright © 2011-2022 走看看