摘要:
该算法也是tarjan发现的,故也叫tarjan算法。这个算法的主体还是dfs,先看算法框架:void make_set(int i){p[i]=i;}int find_set(int i){if(i!=p[i])p[i]=find_set(p[i]);return p[i];}union_set(int i,int j){i=find_set(i),j=find_set(j);p[j]=i;}//tarjan算法主体void dfs(int u){int i,v;make_set(u);for(i=0;i<g[u].size();i++){v=g[u][i];if(p[v]==-1){ 阅读全文
摘要:
tarjan算法的基本框架就是dfs,其基本原理是有向图至少存在一棵深搜子树,其结点集合构成一个强连通分量,这是显然的,因为必定有一个强连通分量最后被dfs,这个强连通分量的结点构成深搜树的一棵子树。有了以上结论后,求强连通分量就有思路了,我们在每棵子树深搜完成后判断这棵子树是否构成强连通分量即可,关键在于如何判断一棵子树是否构成强连通分量。注意到最先搜索完的子树是那些叶子结点,要判断叶子结点是否构成强连通分量很简单,若存在叶子结点与其祖先结点的连边,则该叶子结点不构成强连通分量,否则构成强连通分量。tarjan算法用pre[V]数组和low[V]数组来判断子树是否构成强连通分量,pre[v] 阅读全文