图论总结tarjan算法

匿名 (未验证) 提交于 2019-12-03 00:41:02

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!