强连通分量(strongly connected components, SCCs)是一个能让有向路径上所有节点彼此到达的最大子图。

Kosaraju的查找强连通分量算法

def strongly_connected_components(graph):transpose_graph = get_transpose_graph(graph)scc, seen = [], set()for u in dfs_top_sort(graph):if u in seen:continuecomponent = walk(transpose_graph, u, seen)seen.update(component)scc.append(component)return sccdef get_transpose_graph(graph):transposed = {}for u in graph:transposed[u] = set()for u in graph:for v in graph[u]:transposed[v].add(u)return transposeddef dfs_top_sort(graph):visited, res = set(), []def recurse(u):if u in visited:returnvisited.add(u)for v in graph[u]:recurse(v)res.append(u)for u in graph:recurse(u)res.reverse()return resdef walk(graph, start, s=None):nodes, current = set(), dict()current[start] = Nonenodes.add(start)while nodes:u = nodes.pop()for v in graph[u].difference(current, s):nodes.add(v)current[v] = ureturn currentgraph = {'a': set('bc'),'b': set('dei'),'c': set('d'),'d': set('ah'),'e': set('f'),'f': set('g'),'g': set('eh'),'h': set('i'),'i': set('h'),
}
print(strongly_connected_components(graph))
# [{'a': None, 'd': 'a', 'b': 'd', 'c': 'd'}, {'e': None, 'g': 'e', 'f': 'g'}, {'h': None, 'i': 'h'}]

(最近更新:2019年05月31日)

Python算法教程:强连通分量相关推荐

  1. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  2. 《Python算法教程》——1.6 如果您感兴趣

    本节书摘来自异步社区<Python算法教程>一书中的第1章,第1.6节,作者[挪威]Magnus Lie Hetland(赫特兰), 凌杰 译,更多章节内容可以访问云栖社区"异步 ...

  3. tarjan算法求解强连通分量问题

    Part1:有向图的强连通分量: 一个连通图只有一个联通分量就是自身,非连通图有多个连通分量. 在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从v ...

  4. 算法竞赛——强连通分量

    强连通分量 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连 ...

  5. POJ2186——并查集+Tarjan算法求强连通分量

    算法讨论:这题陷阱比较多.首先,被所有牛欢迎,这说明所有的牛都要在一个连通图中,也就是将所给的边看成无向边的时候,所有点要在一个连通图中.这个我们用并查集来实现就可以了.强连通分量的求法就很简单了,正 ...

  6. Targan 算法[有向图强连通分量]

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

  7. Kosaraju算法求强连通分量

    Kosaraju算法 该算法旨在得到深度优先后续排列后的递归探索中,每次调用DFS的所有顶点都属于同一强联通分量.所以可以这么理解:当递归进入一个强联通分量时,把他锁死在这个强联通分量中(即不能从该强 ...

  8. tarjan算法总结 (强连通分量+缩点+割点),看这一篇就够了~

    文章目录 一.tarjan求强连通分量 1:算法流程 2:模板 二.tarjan缩点 1:相关定义 2:算法流程 三.tarjan求割点.桥 1.什么是割点 2.割点怎么求? 3.割点tarjan模板 ...

  9. 迷宫城堡 HDU - 1269 (塔尖算法求强连通分量)

    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以 ...

  10. ACM教程 - 强连通分量(Tarjan)

    一.讲解一 强连通定义:在有向图G<V,E>中,对于点集V'∈V, 点集中的任意两点都可达,则称V'为强连通. 孤立的一个点也是一个强连通分量. 在嵌套的多个环时 : {所有环上的点}为一 ...

最新文章

  1. 避免在JSP中写java代码
  2. C语言易错图形题--打印n行n列的空心正方形图案
  3. DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
  4. seo黑帽劫持用的php,黑帽seo 论坛:黑帽seo防止网站被k的js劫持跳转代码
  5. windows搭建SFTP服务器
  6. linux 安装dubbo+zookeeper
  7. Idea tomcat get 乱码
  8. android 距离感应器控制屏幕熄灭_书房大变身!有格调的屏幕挂灯,加了它桌面秒变神仙颜值...
  9. 5.Git使用详细教程
  10. 小米3g刷高格固件_小米路由器3g刷第三方固件遇到的一些坑
  11. pycharm生成linux可执行程序,Pycharm生成可执行文件.exe的实现方法
  12. VMware虚拟机XP系统安装教程
  13. 基于原理图法的全加器设计
  14. GitHub使用指南
  15. 谷歌身份验证器(Google Authenticator)的使用详情
  16. java 加密 压缩_如何用java 将文件加密压缩为zip文件.
  17. C++中string类
  18. 小米手环硬件构成及原理图
  19. Java基础动态初始化二维数组
  20. 《千与千寻》里那些耐人寻味的人物和细节

热门文章

  1. 解决maven打包 错误: 程序包com.sun.istack.internal不存在 - BBSMAX
  2. esp32获取网络时间
  3. 【超详细!】【超全面!】计算机二级公共基础知识考点整理
  4. 【Tiny4412】Tiny4412开发板介绍
  5. android 平板刷机工具,小白必看,安卓平板电脑刷机教程之一键刷机
  6. linux手机刷机包制作工具_【 蘑菇ROM助手 】蘑菇ROM助手(刷机包编辑工具)新版下载 - U大师...
  7. unity connect mysql_unity连接mysql
  8. 《概率论与数理统计》(浙大第四版)第七章总结笔记(纯手写)
  9. 2015Esri全球用户大会top10的QA
  10. 手机版q群管机器人_手机QQ机器人怎么用,QQ机器人手机版怎么设置