【问题标题】:Find all Subgraphs using the reflexive transitive closure in Python在 Python 中使用自反传递闭包查找所有子图
【发布时间】:2012-12-16 07:00:44
【问题描述】:

我有一个 Python 代码可以找到传递闭包。

示例:

输入:{('A','B'),('B','C'),('C','D'),('E','F')}

输出:{('B', 'C'), ('A', 'D'), ('A', 'B'), ('C', 'D '), ('B', 'D'), ('E', 'F'), ('A', 'C')}

代码完美运行,但我正在寻找的是将输出作为一组子图。我是 Python 的初学者,我不知道该怎么做。

根据给定的输入,这是我正在寻找的输出,它在集合中有两个元素,每个元素代表传递闭包输出的一个子图:{(A, B, C, D) , (E, F)}

代码如下:

from collections import defaultdict

def transitive_closure(elements):
    edges = defaultdict(set)
    # map from first element of input tuples to "reachable" second elements
    for x, y in elements: edges[x].add(y)

    for _ in range(len(elements) - 1):
        edges = defaultdict(set, (
                                  (k, v.union(*(edges[i] for i in v)))
                                  for (k, v) in edges.items()
                                  ))

    return set((k, i) for (k, v) in edges.items() for i in v)

result = set(transitive_closure([('A','B'),('B','C'),('C','D'),('E','F')]))
print result

【问题讨论】:

  • 你想要的东西没有很好的定义(至少不清楚)。你是什​​么意思“作为最长的可能路径”。例如,您希望以下输入的输出是什么: {('A','B'), ('B', 'C'), ('C', 'A), ('A', 'D'), ('D', 'E'), ('D', 'F')} ?
  • 这似乎不是我的答案;你为什么不把它作为评论发布?
  • 但是我问的那个案子呢?当你有一个循环或一棵有树枝的树时——那么你想要什么?你的问题没有很好的定义是我想说的。这就是我的答案——没有人能回答一个没有明确定义的问题。
  • ['A', 'C', 'B', 'E', 'D', 'F'],这就是您的样本的结果。我明白了,我不应该说 PATH。肯定会有循环,这将导致无限循环。现在我将修改我的问题。
  • 不清楚你在寻找什么子图。您在寻找连接的组件吗?

标签: python python-3.x python-2.7


【解决方案1】:

在 Python 中使用 networkx 解决了问题。 networkx 提供了查找给定子图的所有子图的功能。

我所需要的只是获得 transitive_closure() 方法的输出,将其转换为 networkx 的图,然后将新创建的图作为 connected_component_subgraphs() 的输入 networkx 提供的方法。

H=nx.connected_component_subgraphs(G)

H 是一个包含所有需要的子图的集合。

主要缺点是处理时间,但这是我能找到的最好的。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2011-02-17
    • 2010-10-24
    • 2023-04-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多