#graph #scc #kahn #kosaraju #toposort

toposort-scc

拓扑排序的Kahn算法和强连通分量的Kosaraju算法的实现

11个版本 (4个重大更新)

0.5.4 2020年7月24日
0.5.3 2020年7月24日
0.4.0 2020年7月24日
0.3.1 2020年7月24日
0.1.1 2020年7月23日

#1191 in 算法

Download history 33/week @ 2024-03-15 6/week @ 2024-03-22 23/week @ 2024-03-29 22/week @ 2024-04-05 61/week @ 2024-04-12 9/week @ 2024-04-19 6/week @ 2024-04-26 13/week @ 2024-05-03 17/week @ 2024-05-10 12/week @ 2024-05-17 15/week @ 2024-05-24 15/week @ 2024-05-31 14/week @ 2024-06-07 24/week @ 2024-06-14 18/week @ 2024-06-21 1/week @ 2024-06-28

每月58次下载

MIT/Apache

32KB
305

toposort-scc

拓扑排序的Kahn算法和强连通分量的Kosaraju算法的实现。

  • 基于邻接表的图数据结构(IndexGraph
  • 一个时间复杂度为O(V + E)和额外空间为O(V)的拓扑排序算法(Kahn算法)
  • 一个时间复杂度和额外空间均为O(V)的算法,用于在图中找到强连通分量(Kosaraju算法)
  • 这两个算法都可以在IndexGraph上作为单独的方法(.toposort().scc())或作为一个组合方法(.toposort_or_scc())提供

id-arena特性增加了一个额外的包装类型(ArenaGraph),它允许对使用id-arena crate构建的任意图结构进行拓扑排序和查找强连通分量,通过创建一个已排序的代理图并返回原始图中的索引列表来实现。

示例

此示例创建了一个来自拓扑排序的维基百科页面的示例图的IndexGraph

创建了一个包含循环的图的副本,以演示如何查找强连通分量。

use toposort_scc::IndexGraph;

let g = IndexGraph::from_adjacency_list(&vec![
    vec![3],
    vec![3, 4],
    vec![4, 7],
    vec![5, 6, 7],
    vec![6],
    vec![],
    vec![],
    vec![]
]);

let mut g2 = g.clone();
g2.add_edge(0, 0); // trivial cycle [0]
g2.add_edge(6, 2); // cycle [2, 4, 6]

assert_eq!(g.toposort_or_scc(), Ok(vec![0, 1, 2, 3, 4, 5, 7, 6]));
assert_eq!(g2.toposort_or_scc(), Err(vec![vec![0], vec![4, 2, 6]]));

文档

文档通过rustdoc提供,可以使用cargo doc构建,或在网上查看docs.rs/toposort-scc/

许可

许可协议为以下之一

由您选择。

贡献

除非您明确表示,否则您有意提交以包含在您的工作中的任何贡献(根据Apache-2.0许可证定义),将如上双重许可,不附加任何额外条款或条件。

依赖项