zoukankan      html  css  js  c++  java
  • 初识Tarjan

    Tarjan,一个十分有用的东西,可以求有向图的强连通分量,复杂度达到O(V+E)。

    Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。

    我们开一个数组DFN,记录i这个点是第几个被DFS的,

    再开一个数组LOW,记录它能到达的最近的祖先(即能到达的最先被DFS的点)。

    对于无法搜下去的点,判断它是否在栈中,在栈中即构成强连通分量,即可将LOWx与DFNto取MIN。

    code:

    void tarjan(int x){
        LOW[x]=DFN[x]=++tmn;
        stack[++top]=x;
        vis[x]=1;
            for(int i=0;i<a[x].size();i++){
                int to=a[x][i];
                if(!DFN[to]){//未访问
                    tarjan(to);
                    LOW[x]=min(LOW[x],LOW[to]);
                }
                else if(vis[to])LOW[x]=min(LOW[x],DFN[to]);//在栈里
            }
        if(LOW[x]==DFN[x]){clt++;
            while(x!=stack[top])clo[stack[top]]=clt,vis[stack[top--]]=0;
            clo[stack[top]]=clt,vis[stack[top--]]=0;
        }//强连通分量染色
    }
  • 相关阅读:
    python之打开python源文件方法
    python学习网站
    python知识点
    计算机概念--鸭子类型
    装饰器、函数调用 语句分析法
    python相关软件安装
    python之字典的作用
    [转载]理解HTML语义化
    Java 入门 代码2浮点数据类型
    Java入门1dayCode
  • 原文地址:https://www.cnblogs.com/Cptraser/p/7741781.html
Copyright © 2011-2022 走看看