引入

tarjan算法可以在图上求解LCA,强连通分量,双联通分量(点双,边双),割点,割边,等各种问题。

这里简单整理一下tarjan算法的几个应用。

LCA

http://www.cnblogs.com/mjtcn/p/6852646.html

强联通分量

有向图的

强联通:在一个有向图G里,设两个点 a b 发现,由a有一条路可以走到b,由b又有一条路可以走到a,我们就叫这两个顶点(a,b)强连通。

强连通图: 如果 在一个有向图G中,每两个点都强连通,我们就叫这个图,强连通图。

强连通分量:在一个有向图G中,有一个子图,这个子图每2个点都满足强连通,我们就叫这个子图叫做 强连通分量 [分量:把一个向量分解成几个方向的向量的和,那些方向上的向量就叫做该向量(未分解前的向量)的分量]

http://www.cnblogs.com/mjtcn/p/7599217.html

 

边双联通分量

无向图的

边双联通图:如果在一个无向图中,任意两点至少存在两条不重复路径,则称该图为边双连通的。

边双联通分量:边双连通的极大子图称为边双连通分量

原理和强联通分量的求法差不多。

 1 void tarjan(int u,int fa) {
 2     dfn[u] = low[u] = ++tn;
 3     st[++top] = u;
 4     vis[u] = true;
 5     for (int i=head[u]; i; i=e[i].nxt) {
 6         int v = e[i].to;
 7         if (!dfn[v]) {
 8             tarjan(v);
 9             low[u] = min(low[u],low[v]);
10         }
11         else if (vis[v] && v!=fa) 
12             low[u] = min(low[u],dfn[v]);
13     }
14     if (dfn[u] == low[u]) {
15         ++cnt;
16         do {
17             vis[st[top]] = false;
18             bel[st[top]] = cnt;
19             top--;
20         } while (st[top+1] != u);
21     }
22 }
View Code

相关文章: