有向图节点:跟踪后继者和前任者

时间:2012-04-08 14:47:30

标签: python directed-graph

我正在尝试实现一个表示有向图中节点的类Node,该节点特别具有一组后继和前导。我希望Node.predecessorsNode.predecessors表现得像集合,特别是我想迭代它们的元素,添加和删除元素,检查包含,并从迭代中设置它们。但是,在node_1.sucessors.add(node_2)之后,node_1 in node_2.pedecessors

应为True

似乎有可能编写一个新的set子类来实现这个魔法,但据我所知,这样一个类的实现会非常麻烦,因为它必须知道{{1它所属的对象,如果它是前任或后继者,并且需要一些特殊的方法来添加等等,那么Node将不会调用node_1.sucessors.add(node_2),从而导致无限循环。 / p>

应该可以动态生成两个属性中的一个node_2.predecessors.add(node_1),但是我需要跟踪属于图形的所有节点,这很容易(将其添加到(node for node in all_nodes if self in node.sucessors)weakref.WeakSet中的属性如果我只有一个图形,但是如果我有多个不相交的图形,那么对所有节点使用一个大集会导致大量的计算工作,而我看不到如何修改前一组图。

有人为此提供了很好的解决方案吗?

1 个答案:

答案 0 :(得分:5)

如果将add方法包装在类中,然后在该包装器方法中使用前两个属性和先行者,那该怎么办?像这样的东西

这是我想到的第一个解决方案:

class Node:

    def __init__(self):
        self.pred = set()
        self.suce = set()

    def addSucessor(self, node):
        self.suce.add(node)
        node.pred.add(self)