我正在尝试实现Tarjan的强连接组件(SCC)的迭代版本,为方便起见,在此复制(来源:http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm)。Input:GraphG=(V,E)index=0//DFSnodenumbercounterS=empty//AnemptystackofnodesforallvinVdoif(v.indexisundefined)//StartaDFSateachnodetarjan(v)//wehaven'tvisitedyetprocedureta
目录一、什么是强连通分量1.概念2.强连通分量二、两种dfs遍历1.方式12.方式2三、一个简单例子理解算法四、更完整的一个例子五、Code实现一、什么是强连通分量tarjan强连通分量算法1.概念连通:无向图中,从任意点i可到达任一点j强连通:有向图中,从任意点i可到达任一点j弱连通:把有向图看作无向图时,从任意点i可到达任一点j如图,强连通无论那个点,都能按照方向到达任意一点,弱连通如果强行按方向,那么B到不了C,A到不了B和C,C到不了B。但如果把他看作是无向图,那么他们也能满足连通条件。2.强连通分量整个图并不是强连通的,但是在某些局部区域,他确实也符合强连通的要求,如下图,整张图不算
我根据wikipedia实现了Tarjan的强连通分量算法,在Python中,但它不起作用。该算法很短,我找不到任何区别,所以我不知道为什么它不起作用。我试图查看原始论文,但找不到。这是代码。defstrongConnect(v):globalE,idx,CCs,c,Sidx[v]=(c,c)#idx[v][0]forv.index#idx[v][1]forv.lowlinkc+=1S.append(v)forwin[ufor(v2,u)inEifv==v2]:ifidx[w][0]您可以checkthegraphvisually如果你更喜欢。如您所见,这是对维基百科中伪代码的相当前向
这是tarjan循环检测的有效C#实现。算法可以在这里找到:http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithmpublicclassTarjanCycleDetect{privatestaticList>StronglyConnectedComponents;privatestaticStackS;privatestaticintindex;privatestaticDepGraphdg;publicstaticList>DetectCycle(DepGraphg){Strong
题目传送门:https://www.luogu.com.cn/problem/P1073思路:首先,我们目的是想要在图上dp求最优的路线,但是原图上会存在环,那么我们就要先通过tarjan缩点,将所有环缩成一个点,同时,记录每个点的最大值和最小值,缩点得到DAG后,我们可以在DAG上进行dp,每次转移有三种方式,一是保留上一个点的dp值,二是求得目前所在点的值,三是这个点本身的dp值,三者取最大就ok了。还要注意的是,在建DAG图的时候,要记录每个点的入度,在之后的dp过程中,每一个点在全部走到的时候,才能压入队列,进行更新操作,保证dp内的值是最优的,也就是无后效性。代码:1#include
题目传送门:https://www.luogu.com.cn/problem/P1073思路:首先,我们目的是想要在图上dp求最优的路线,但是原图上会存在环,那么我们就要先通过tarjan缩点,将所有环缩成一个点,同时,记录每个点的最大值和最小值,缩点得到DAG后,我们可以在DAG上进行dp,每次转移有三种方式,一是保留上一个点的dp值,二是求得目前所在点的值,三是这个点本身的dp值,三者取最大就ok了。还要注意的是,在建DAG图的时候,要记录每个点的入度,在之后的dp过程中,每一个点在全部走到的时候,才能压入队列,进行更新操作,保证dp内的值是最优的,也就是无后效性。代码:1#include
定义如果在一个图中,删除某个节点连同与之关联的边,会导致整个图的连通分支数增加,那么这个节点叫做割点(ArticulationPoint,CutVertex)如下图:整个图的连通分支数为1,但是删除节点3后,整个图就“分裂”成了2个连通分支:因此,节点3是整个图的割点。方法一个很容易想到的方法是,依次删除图中的每一个节点,看剩下部分的连通分支数增没增加。但是那样显然太浪费时间了!有没有一种办法,能够快速的找出整个图的割点呢?Tarjan算法的核心思想:深度优先遍历(DFS)这张图,得到的DFS树(由遍历路径和节点构成的树)中,当某个节点u满足以下条件之一时,它就是割点:u为DFS树的树根,且u
定义如果在一个图中,删除某个节点连同与之关联的边,会导致整个图的连通分支数增加,那么这个节点叫做割点(ArticulationPoint,CutVertex)如下图:整个图的连通分支数为1,但是删除节点3后,整个图就“分裂”成了2个连通分支:因此,节点3是整个图的割点。方法一个很容易想到的方法是,依次删除图中的每一个节点,看剩下部分的连通分支数增没增加。但是那样显然太浪费时间了!有没有一种办法,能够快速的找出整个图的割点呢?Tarjan算法的核心思想:深度优先遍历(DFS)这张图,得到的DFS树(由遍历路径和节点构成的树)中,当某个节点u满足以下条件之一时,它就是割点:u为DFS树的树根,且u