zoukankan      html  css  js  c++  java
  • 求无向图的割点和桥(模版)(训练指南)

    割点:

    int n;
    vector<int> G[maxn];
    int pre[maxn],low[maxn];
    int dfs_clock;
    bool iscut[maxn];
    
    void init()
    {
        MS0(pre);MS0(iscut);
        dfs_clock=0;
    }
    
    int dfs(int u,int f) /// 调用:dfs(rt,0)
    {
        int lowu=pre[u]=++dfs_clock;
        int child=0;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(u==f) continue;
            if(!pre[v]){
                child++;
                lowu=min(lowu,dfs(v,u));
                if(low[v]>=pre[u]) iscut[u]=1;
            }
            else if(pre[v]<pre[u]) lowu=min(lowu,pre[v]);
        }
        if(f==0&&child==1) iscut[u]=0;
        return low[u]=lowu;
    }
    View Code

    桥:

    int n;
    vector<int> G[maxn];
    int pre[maxn],low[maxn];
    int dfs_clock;
    struct Edge
    {
        int u,v;
    };vector<Edge> bridge;
    
    void init()
    {
        MS0(pre);
        dfs_clock=0;
        bridge.clear();
    }
    
    int dfs(int u,int f) /// 调用:dfs(rt,0)
    {
        int lowu=pre[u]=++dfs_clock;
        int child=0;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(u==f) continue;
            if(!pre[v]){
                lowu=min(lowu,dfs(v,u));
                if(low[v]>pre[u]) bridge.push_back({u,v});
            }
            else if(pre[v]<pre[u]) lowu=min(lowu,pre[v]);
        }
        return low[u]=lowu;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    第四次作业
    第三次作业
    第二次作业。
    国庆作业。
    实验2-4
    实验2-3
    实验2-2
    实验2-1
    实验1-3
    实验 1-1
  • 原文地址:https://www.cnblogs.com/--560/p/5192659.html
Copyright © 2011-2022 走看看