不会Tarjan,难道就不能与邪恶的SCC作斗争了吗?

  祭出Kosaraju。

  一些变量名的意义:

  a[N] 原图的vector存储

  b[N] 原图的所有边反向vector存储

  s dfs得出的拓扑序列栈

  c[[N] 每个点的SCC编号

  算法框架:

  1.将原图做一遍类似于拓扑的dfs,越早访问的顶点压在一个栈中。

  2.不断从栈顶取出一个未访问过的点,对它的反向图再进行dfs,所有它能到达的未访问过的点就是他的SCC。

  3.这样就得到的一个图的SCC。

  对于2的正确性,应为这个点必被在栈中比它早入栈的点给压入栈,而且在栈中比它更上面的点已经被访问过,所以它在它下面能找到的点都是他的SCC(同时还避免了重复)

  CODE

  核心的两遍dfs

inline void dfs(int k)
{
f[k]=;
for (int i=;i<a[k].size();++i)
if (f[a[k][i]]) dfs(a[k][i]);
s.push_back(k);
}
inline void rdfs(int k)
{
f[k]=;
c[k]=tot;
t[tot]++;
for (int i=;i<b[k].size();++i)
if (f[b[k][i]]) rdfs(b[k][i]);
}

  在主程序中只要:

    memset(f,true,sizeof(f));
  for (i=;i<=n;++i)
if (f[i]) dfs(i);
memset(f,true,sizeof(f));
for (i=s.size()-;i>=0;--i)
if (f[s[i]]) ++tot,rdfs(s[i]);

  复杂度为O(|V|+|E|) 虽然跑得没有Tarjan快,但是个人认为很容易理解。

SCC的奇葩算法——Kosaraju的更多相关文章

  1. Kosaraju算法---强联通分量

    1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组).      算法描叙: :对 ...

  2. 连通图算法详解之① :Tarjan 和 Kosaraju 算法

    相关阅读: 双连通分量 ,割点和桥 简介 在阅读下列内容之前,请务必了解 图论相关概念 中的基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly ...

  3. Kosaraju算法学习

    Kosaraju 算法学习 序 这星期捣鼓了一个新的算法--Kosaraju算法 今天分享给大家 简介 Kosaraju算法,其实与tarjan算法差不多.但是码量较小,容易记忆.其时间复杂度与tar ...

  4. 图解:有向环、拓扑排序与Kosaraju算法

    图算法第三篇 图解:有向环.拓扑排序与Kosaraju算法 首先来看一下今天的内容大纲,内容非常多,主要是对算法思路与来源的讲解,图文并茂,希望对你有帮助~ 1.有向图的概念和表示 概念 有向图与上一 ...

  5. 强连通分量算法-codevs1332

    解决有向图的强连通分量的算法,有两个,一个是tarjan,一个是kosaraju,上午只看了一下kosaraju,不算太难,理解之后写了个模板题. 先说kosaraju算法,算法的主要思路是进行两次d ...

  6. 20行代码实现,使用Tarjan算法求解强连通分量

    今天是算法数据结构专题的第36篇文章,我们一起来继续聊聊强连通分量分解的算法. 在上一篇文章当中我们分享了强连通分量分解的一个经典算法Kosaraju算法,它的核心原理是通过将图翻转,以及两次递归来实 ...

  7. 算法学习笔记:Tarjan算法

    在上一篇文章当中我们分享了强连通分量分解的一个经典算法Kosaraju算法,它的核心原理是通过将图翻转,以及两次递归来实现.今天介绍的算法名叫Tarjan,同样是一个很奇怪的名字,奇怪就对了,这也是以 ...

  8. 有向图强连通分量 Tarjan算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  9. TarJan 算法求解有向连通图强连通分量

    [有向图强连通分量] 在有向图G中,如果两个 顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的 ...

随机推荐

  1. 【疑难杂症04】EOFException异常详解

    最近线上的系统被检测出有错误日志,领导让我检查下问题,我就顺便了解了下这个异常. 了解一个类,当然是先去看他的API,EOFException的API如下: 通过这个API,我们可以得出以下信息: 这 ...

  2. Python——Queue模块以及生产消费者模型

    1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...

  3. CAC的Debian-8-64bit安装BBR正确打开方式

    装过三台debian 64 bit, CAC, 2欧, KVM虚拟机 做法都一样---下面说下正确安装方式   0. 有装锐速记得先删除,免得换核心后,锐速在扯后腿.   1.换4.9版kernel ...

  4. 使用 Azure CLI 创建 Windows 虚拟机

    Azure CLI 用于从命令行或脚本创建和管理 Azure 资源. 本指南详细介绍如何使用 Azure CLI 部署运行 Windows Server 2016 的虚拟机. 部署完成后,我们连接到服 ...

  5. SpringMVC_JDBC

    链接:https://pan.baidu.com/s/1a8Aht1eIeRYGb78X9v3ubA 密码:h2zy 未完,待续...

  6. 【转】Java学习---快速掌握RPC原理及实现

    [原文]https://www.toutiao.com/i6592365493435236872/ ​RPC概述 RPC(Remote Procedure Call)即远程过程调用,也就是说两台服务器 ...

  7. 如何使用EditPlus批量删除 带有某个字符的一行

    比如以下五行,我要将带有英文字母a的一行全部批量删除1234551243243123aa244123123981232137aa 2013-04-11 19:32   提问者采纳   我这里是英文版, ...

  8. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

  9. python第二十九课——文件读写(readline()和readlines()的使用)

    演示readline()和readlines()的使用: #1.打开文件 f3=open(r'a.txt','r',encoding='gbk') #2.读取数据 content3=f3.readli ...

  10. Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()

    解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...