Python算法教程:强连通分量

本文深入探讨了有向图中的强连通分量(SCCs)概念,详细介绍了Kosaraju算法如何高效地找出图中所有强连通分量。通过示例代码展示了算法的具体实现过程。

强连通分量(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日)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值