对于求有向图的强连通分量 , 我常用的一般只有这三种算法Kosaraju、Tarjan、Garbow,而这三种算法 , Tarjan和Garbow算法的思想是一样的 , 只不过是实现的方法不一样 , 下面就逐一分析这三个算法:
1、Kosaraju
Kosaraju算法主要是利用有向图中原图和其反图之间的关系 , 对于一个原图中的强连通分量 , 其在反图中还是强连通分量 , 原图中存在u 到 v的边 , 在反图中就只存在 v 到 u的边 , 而不存在u 到 v的边。 根据这个关系 , 我们先用原图进行dfs搜索 , 得到了一个森林(树) , 我们再按照原图中得到的dfs搜索序列 , 在其反图中进行dfs搜索 , 每次搜索能遍历到的顶点就是一个强连通分量。
代码:
//Kosaraju算法
int dfsone(int cur)
{
temp[cur] = true;
for(int i = head[cur] ; i != -1; i = edge[i].next)
{
if(!temp[edge[i].t])
dfsone(edge[i].t);
}
num[++sig] = cur;
return 0;
}
int dfstwo(int cur , int sig)
{
temp[cur] = true;
scc[cur] = sig;
for(int i = head2[cur] ; i != -1; i = edge[i].next2)
{
if(!temp(edge[i].f))
dfstwo(edge[i].f , sig);
1、Kosaraju
代码:
//Kosaraju算法
int dfsone(int cur)
{
}
int dfstwo(int cur , int sig)
{