求强连通分量几种算法的比较

对于求有向图的强连通分量 , 我常用的一般只有这三种算法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);
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值