无向连通图 割点 桥 模板

来源:互联网 发布:mac子弹头试色twig 编辑:程序博客网 时间:2024/05/18 00:43
  1. 先通过tarjan标记一遍dfn和low数组,再计数。
  2. 可以任选一个节点为根,如果是一个环,那么dfs可以直接判断出来是一个根节点。如果根节点有大于一个的子树,说明这个节点是割点。
  3. 割点要 >=, 桥>。
  4. 要注意题目有没有重边,如果有,计算桥的时候要特殊标记。
  5. 割点的数目不等于可以分割部分的数目,后者要用强连通分量来计算。
  6. 求桥时无需判断是否是根节点。
  7. 因为是无向图,所以不存在访问到已访问节点的情况,只可能访问到在栈中的节点。
const int maxn = 110;int times;int dfn[maxn], low[maxn];bool cut[maxn];vector<int> G[maxn];void Tarjan(int u, int fa){    dfn[u] = low[u] = ++times;    int childs = 0;    for(int i = 0; i < G[u].size(); ++i){        int v = G[u][i];        if(!dfn[v]){            childs++;            Tarjan(v, u);            low[u] = min(low[u], low[v]);            if(low[v]>=dfn[u] && fa>0)//割点                cut[u] = true;//            if(low[v] > dfn[u])                //u-v是一个桥,但需要判断是否有重边        }        else if(fa != v)//因为这是一个无向图            low[u]=min(low[u], dfn[v]);    }    if(fa < 0)        cut[u] = (childs>=2) ? true : false;}
1 0
原创粉丝点击