使用 scipy 将最小生成树转换为索引列表?

Posted

技术标签:

【中文标题】使用 scipy 将最小生成树转换为索引列表?【英文标题】:convert minimum spanning tree to list of indices using scipy? 【发布时间】:2022-01-20 18:34:59 【问题描述】:

如果我有以下输入输出图

 input graph             minimum spanning tree

     (0)                         (0)
    /   \                       /
   3     8                     3
  /       \                   /
(3)---5---(1)               (3)---5---(1)
  \       /                           /
   6     2                           2
    \   /                           /
     (2)                         (2)

...使用 scipy.sparse.csgraph.minimum_spanning_tree 创建:

>>> from scipy.sparse import csr_matrix
>>> from scipy.sparse.csgraph import minimum_spanning_tree
>>> X = csr_matrix([[0, 8, 0, 3],
...                 [0, 0, 2, 5],
...                 [0, 0, 0, 6],
...                 [0, 0, 0, 0]])
>>> Tcsr = minimum_spanning_tree(X)
>>> Tcsr.toarray().astype(int)
array([[0, 0, 0, 3],
       [0, 0, 2, 5],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

如何生成一个简单的索引列表?所以:

[0,3,1,2]

【问题讨论】:

你愿意使用networkx吗? 我理想的答案是留在 scipy 中,但为了我的生活继续前进,我会接受 networkx 我认为我们需要更多信息才能回答这个问题。如果最小生成树是一棵没有自然顺序排序的树,你想要什么输出?您是否正在寻找深度优先排序?广度优先?还有什么? 【参考方案1】:

scipy.sparse.csgraph 包含按深度优先或广度优先顺序列出节点的方法:

from scipy.sparse.csgraph import breadth_first_order, depth_first_order

print(breadth_first_order(Tcsr, i_start=0, directed=False, return_predecessors=False))
# [0 3 1 2]
print(depth_first_order(Tcsr, i_start=0, directed=False, return_predecessors=False))
# [0 3 1 2]

由于您的树只有一个分支,因此这两种方法会产生相同的结果。但是对于更一般的生成树,你应该根据你感兴趣的遍历顺序来选择方法。

【讨论】:

以上是关于使用 scipy 将最小生成树转换为索引列表?的主要内容,如果未能解决你的问题,请参考以下文章

最小生成树的Python实现

(板子) 最小生成树 买礼物 luogu P1194

Codeforces 1108F MST Unification(最小生成树性质)

图的最小生成树

CODEVS1078最小生成树

1078 最小生成树