我有一个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
答案 0 :(得分:1)
在Python中使用 networkx 解决了问题。 networkx 提供了查找给定子图的所有子图的功能。
我只需要输出 transitive_closure()方法的输出,将其转换为networkx的图形,然后将新创建的图形作为 connected_component_subgraphs()的输入方法由networkx提供。
H=nx.connected_component_subgraphs(G)
H是一个包含所有需要的子图的集合。
主要缺点是处理时间,但这是我能找到的最好的。