Python算法教程:强连通分量

2023-11-07

强连通分量(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:
            continue
        component = walk(transpose_graph, u, seen)
        seen.update(component)
        scc.append(component)
    return scc


def 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 transposed


def dfs_top_sort(graph):
    visited, res = set(), []

    def recurse(u):
        if u in visited:
            return
        visited.add(u)
        for v in graph[u]:
            recurse(v)
        res.append(u)

    for u in graph:
        recurse(u)

    res.reverse()
    return res


def walk(graph, start, s=None):
    nodes, current = set(), dict()
    current[start] = None
    nodes.add(start)
    while nodes:
        u = nodes.pop()
        for v in graph[u].difference(current, s):
            nodes.add(v)
            current[v] = u
    return current


graph = {
    '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日)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python算法教程:强连通分量 的相关文章

随机推荐

  • 可以把将日文汉字转换成平假名、片假名、罗马音的KaKaSi

    了解它 KAKASI Kanji Kana Simple Inverter 是语言处理过滤器 可以将 日文汉字 转换成 平假名 片假名或Romaji 可以 方便阅读日文文本 以及 给日语学习者提供便利 比如把漢字 转换成 kanji 例子
  • java web 实战开发经典_java web 开发实战经典(一)

    一 jsp三种Scriptlet 脚本小程序 1 定义局部变量 编写语句等 out println str 编写语句 gt 2 定义全局变量 方法和类 虽然此方可以编写类 但不建议使用 我们一般通过JavaBean的形式调用类 public
  • 区块链学术会议/研究团队汇总

    欢迎评论补充 共建区块链学术生态 一 常见区块链文章发布会议 期刊 领域 简称 全称 CCF Level 备注 网络与信息安全 USENIX Security CCF A TIFS CCF A S P CCF A CCS CCF A Jou
  • 开窗函数 OVER(PARTITION BY)函数介绍

    开窗函数 分析函数用于计算基于组的某种聚合值 它和聚合函数的不同之处是 对于每个组返回多行 而聚合函数对于每个组只返回一行 开窗函数指定了分析函数工作的数据窗口大小 这个数据窗口大小可能会随着行的变化而变化 排序 即便值一样 也不会出现重复
  • java与数据库的相关小知识

    1 软编码链接数据库 public class DBManager private Connection con public Connection getCon String driverClass null String jdbcUrl
  • 实现物体的移动--刚体和代码中操控位置移动

    文章目录 实现物体的移动 先让物体有碰撞体积 给物体绑定刚体 实现物体的移动 先让物体有碰撞体积 给物体绑定刚体 其他的属性和使用方法可以到文档里查看 文档真的超级详细 但是光有碰撞规则是不行的 我们要为它加一个刚体 将对应函数绑定好 然后
  • 计算机网络设置中如何删除家庭组,【求助】Windows无法从该家庭组中删除你的计算机...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 echo 服务名称fdPHost 显示名称Function Discovery Provider Host 进程svchost exe echo DEMAND或DISABLED或AUTO 手动
  • 树莓派 安装Arch Linux ARM

    首先 需要一个linux环境 archlinuxarm系统的安装需要用linux环境复制文件 把sd卡或tf卡连接到装有linux环境的电脑上 首先 确定自己树莓派的型号是b 2b 还是3b 选择合适版本 打开终端 并获得超级权限 sudo
  • Sonar Java默认扫描规则

    规则如下 equals should not be used to test the values of Atomic classes equals 方法不应该用在原子类型的数据上 如 AtomicInteger AtomicLong At
  • MCDF实验——Lab4

    在之前的Lab3中 通过一个初具规模的MCDT的验证环境 学习到 验证环境按照隔离的观念 应分为硬件DUT 软件验证环境 和处于信号媒介的接口interface 对于软件验证环境 需要经历建立阶段 build 连接阶段 connect 产生
  • 浅谈项目售前调研

    一 概述 说到软件项目的售前调研工作 可能还得先谈谈售前顾问这个重要的角色 在IT软件行业 售前顾问位于职业金字塔顶端 是项目开发 实施人员与销售人员间的纽带和桥梁 在销售人员眼中 售前顾问扮演的是技术专家的角色 而在项目实施和开发人员眼中
  • 中兴网络设备交换机路由器查看日志命令方法

    描述 中兴网络设备交换机路由器查看日志命令方法 命令 show logfile
  • 小程序如何实现本地去水印

    自媒体时代 很多人都进行伪原创 但是有些视频本身就有水印的 这个时候我们怎么办 很多人都不懂这个方法 所以导致很多人不会使用 一般都是电脑操作 那我们就没有办法了吗 今天介绍的就是小程序如何实现本地去水印 我们也知道FFmpeg命令 去掉视
  • 波形分析软件 android,新版 PicoScope 软件提供更出色的波形分析和功能 – 免费获取!...

    全球领先的 PC 示波器制造商 Pico Technology Ltd 发布了 PicoScope 软件 6 11 7 版 此版本的 PicoScope 可为研发新一代电气和电子技术的工程师 科学家 技术人员和研究人员提供重要的新功能 本文
  • wifi感知---csi技术

    CSI在WiFi研究领域指Channel State Information 也就是通过接收到的WiFi信号来估计WiFi信号的传播信道长什么样子 它表征了一系列影响的综合 例如散射 衰落 能量随着距离的衰减 目前人们可以从CSI里提取到很
  • C#文件读写小案例

    目录 1 驱动器管理类 2 目录管理类 3 文件管理类 4 路径管理类 5 FileStream类读取文件 6 StreamReader类读取文件 7 使用FileStream类写入文件 用FileStream类写入文件可以指定要写入的位置
  • 逐个版本分析鬼火引擎

    这段时间做手游的cocos2dx的学习 和做web开发的项目 感觉很没劲 还是得研究引擎 我看到有个人的博客直接分析鬼火引擎0 1版本 这个方法不错 两万行左右代码 sourceforge里面有各个版本的代码 这样 正好可以循序渐进地进行
  • Maven导包及打包

    Maven是什么 Maven是一个跨平台的项目管理工具 作为Apache组织的一个颇为成功的开源项目 其主要服务于基于Java平台的项目创建 依赖管理和项目信息管理 是一个自动化构建工具 maven是Apache的顶级项目 解释为 专家 内
  • org.springframework.web.bind.annotation 注解详解

    处理request RequestBody RequestHeader RequestMapping RequestParam RequestPart CookieValue PathVariable 传送门 处理response Resp
  • Python算法教程:强连通分量

    强连通分量 strongly connected components SCCs 是一个能让有向路径上所有节点彼此到达的最大子图 Kosaraju的查找强连通分量算法 def strongly connected components gr