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!
  • 相关阅读:
    设计模式(二)
    关于ICO
    js的中关于类的应用
    接口的实现顺序学习笔记[2]
    接口的继承学习笔记[1]
    设计模式(一)
    四种领域模型
    路径问题!!
    异步调用模式学习记录
    转:四人帮设计模式
  • 原文地址:https://www.cnblogs.com/--560/p/5192659.html
Copyright © 2011-2022 走看看