Python算法教程:强连通分量
强连通分量(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算法教程:强连通分量相关推荐
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...
- 《Python算法教程》——1.6 如果您感兴趣
本节书摘来自异步社区<Python算法教程>一书中的第1章,第1.6节,作者[挪威]Magnus Lie Hetland(赫特兰), 凌杰 译,更多章节内容可以访问云栖社区"异步 ...
- tarjan算法求解强连通分量问题
Part1:有向图的强连通分量: 一个连通图只有一个联通分量就是自身,非连通图有多个连通分量. 在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从v ...
- 算法竞赛——强连通分量
强连通分量 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连 ...
- POJ2186——并查集+Tarjan算法求强连通分量
算法讨论:这题陷阱比较多.首先,被所有牛欢迎,这说明所有的牛都要在一个连通图中,也就是将所给的边看成无向边的时候,所有点要在一个连通图中.这个我们用并查集来实现就可以了.强连通分量的求法就很简单了,正 ...
- Targan 算法[有向图强连通分量]
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(stronglyconnected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...
- Kosaraju算法求强连通分量
Kosaraju算法 该算法旨在得到深度优先后续排列后的递归探索中,每次调用DFS的所有顶点都属于同一强联通分量.所以可以这么理解:当递归进入一个强联通分量时,把他锁死在这个强联通分量中(即不能从该强 ...
- tarjan算法总结 (强连通分量+缩点+割点),看这一篇就够了~
文章目录 一.tarjan求强连通分量 1:算法流程 2:模板 二.tarjan缩点 1:相关定义 2:算法流程 三.tarjan求割点.桥 1.什么是割点 2.割点怎么求? 3.割点tarjan模板 ...
- 迷宫城堡 HDU - 1269 (塔尖算法求强连通分量)
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以 ...
- ACM教程 - 强连通分量(Tarjan)
一.讲解一 强连通定义:在有向图G<V,E>中,对于点集V'∈V, 点集中的任意两点都可达,则称V'为强连通. 孤立的一个点也是一个强连通分量. 在嵌套的多个环时 : {所有环上的点}为一 ...
最新文章
- 避免在JSP中写java代码
- C语言易错图形题--打印n行n列的空心正方形图案
- DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
- seo黑帽劫持用的php,黑帽seo 论坛:黑帽seo防止网站被k的js劫持跳转代码
- windows搭建SFTP服务器
- linux 安装dubbo+zookeeper
- Idea tomcat get 乱码
- android 距离感应器控制屏幕熄灭_书房大变身!有格调的屏幕挂灯,加了它桌面秒变神仙颜值...
- 5.Git使用详细教程
- 小米3g刷高格固件_小米路由器3g刷第三方固件遇到的一些坑
- pycharm生成linux可执行程序,Pycharm生成可执行文件.exe的实现方法
- VMware虚拟机XP系统安装教程
- 基于原理图法的全加器设计
- GitHub使用指南
- 谷歌身份验证器(Google Authenticator)的使用详情
- java 加密 压缩_如何用java 将文件加密压缩为zip文件.
- C++中string类
- 小米手环硬件构成及原理图
- Java基础动态初始化二维数组
- 《千与千寻》里那些耐人寻味的人物和细节
热门文章
- 解决maven打包 错误: 程序包com.sun.istack.internal不存在 - BBSMAX
- esp32获取网络时间
- 【超详细!】【超全面!】计算机二级公共基础知识考点整理
- 【Tiny4412】Tiny4412开发板介绍
- android 平板刷机工具,小白必看,安卓平板电脑刷机教程之一键刷机
- linux手机刷机包制作工具_【 蘑菇ROM助手 】蘑菇ROM助手(刷机包编辑工具)新版下载 - U大师...
- unity connect mysql_unity连接mysql
- 《概率论与数理统计》(浙大第四版)第七章总结笔记(纯手写)
- 2015Esri全球用户大会top10的QA
- 手机版q群管机器人_手机QQ机器人怎么用,QQ机器人手机版怎么设置