强连通分量 Tarjan
前言
其实很早就会用Tarjan打强连通了,但还是有些一知半解,也忘性大,现在总结一下。
强连通分量的定义
假设我们现在有这个图:
很显然这三个点两两之间可以到达,那么我们就称这个图是强连通的。
假设我们多加一个节点
之前的子图强连通,但不是强联通分量,因为它不是最大的强连通子图,而{1,2,3,4}是强连通分量。一个强连通分量的子图可能有多个是连通分量,但我们找强连通分量是要找尽可能大的。
那么得出定义:有向图的极大强连通子图,称为强连通分量。
用途
首先为什么要找?
1.常用于有向图的缩点
缩点就是把每个强连通分量变成分别几个点。
比如这个图:
缩点后就变成:
{1,2,3,4}对应3,5、6分别对应2、1(单独构成强连通分量)
比如这道题:
- 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细,将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1,则奸细i能将消息直接传递给奸细j。
现在曹操要发布一个假消息,需要传达给所有奸细,而我们的郭嘉大大则需要传递给尽量少的奸细使所有的奸细都知道这一个消息,问我们至少要传给几个奸细
显然,如果把奸细直接的关系图缩点后,只要求出入度为0的强连通分量个数就行了。
2.解决2-SAT问题(这里先不讲)
Tarjan求强连通分量(缩点)
先给出一些定义:
d f n [ u ] dfn[u] dfn[u]表示 u u u的搜索次序(时间戳,就是说 u u u是第几个搜到的)
l o w [ u ] low[u] low[u]表示 u u