tarjan算法,是一个可以在有向图中找到强连通分量的的算法。
首先你要了解什么是强连通,以及什么是强连通分量。
下面是我给的简释:
一、强连通。
二、强连通子图。
三、强连通分量
极大的强连通子图。
解释:强连通分量 百度百科
好的,那么现在就有一个问题:
输入:一个图有向图。
输出:它每个强连通分量。
用tarjan算法怎么实现呢?
先给出几个变量的意义:
1.DFN[i]表示第几个搜索到的;
2.LOW[i]表示从搜索的路返回,最多能走到哪里。
3.STACK[i]表示一个栈。
输出了一个图,长这样:
xiam下面几张图是深搜的过程:(假设我们从第一个点开始搜)
如下图:搜到6,走不动了,开始回溯。然后6出栈。6节点就是一个强连通分量。
于是 有了下图:回溯到3节点,操作不动了,3出栈。三就是一个强连通分量。
4走过了,于是继续操作至下图:
回溯到2,然后三走过,继续走5,五再继续操作,6走过且有DFN[6]!=LOW[6],走1;
发现DFN[1]=LOW[1]
可以说明找到环了,就找到了一个强连通分量
LOW[4]=1;
然后还有一个栈内的搜索图,就是什么时候出栈,这个你可以自己画一下,就可以明白了。
然后最后栈里面剩下来的,就是所求的qian强连通分量。
好,下面以之前的那一道例题作为实战:(就是之前的那一道题)
输入n,m;
表示有n个点,m条边,下面输入m条边(单向边);
输出所有的强连通分量。
下面是我自己的代码:
(你可以输入上面那个图验证)
推荐洛谷题目:p3387
文章来源: 图论总结tarjan算法