传递减少 - 代码错误 - Python

时间:2016-08-24 16:34:19

标签: python list graph transitive-closure

所以我正在尝试编写一个代码来进行非循环图的传递减少。 所以元素是:

  

(3,5),(5,2),(2,1),(4,2),(3,1),(4,1)

这是我到目前为止所写的:

graph = [[3, 5],[5, 2],[2, 1],[4, 2],[3, 1],[4, 1]]

for i in range(len(graph)):
    for j in range(len(graph)):
        for k in range(len(graph)):
            if [i,j] in graph and [j,k] in graph:
                a = [i,k]
                graph.pop(a)
print(graph)                

跑步后我希望得到以下内容(4,1)已删除:

>> (3, 5), (5, 2), (2, 1), (4, 2), (3, 1)

但它会返回:

>> (3, 5), (5, 2), (2, 1), (4, 2), (3, 1), (4, 1)

我无法弄清楚我做错了什么。如果有人可以指出错误,那就太棒了!

P.S:Transtive reduction正在删除图形的冗余边缘。例如:

如果(A - > B)和(B - > C),则(A - > C),换句话说:如果A连接到B而B连接到C,则A也是连接到C.在这种情况下 (A - > C)是多余的,因为A可以到达C到B,因此应该被删除。

1 个答案:

答案 0 :(得分:1)

我改进了你的代码,我添加了条件if a in graph:,因为在某些情况下会出现Transtive减少并且元素[i,k]不存在。此外,函数pop()按索引删除元素,而不是像remove()这样的对象删除。

graph = [[3, 5],[5, 2],[2, 1],[4, 2],[3, 1],[4, 1]]

for i in range(len(graph)):
    for j in range(len(graph)):
        for k in range(len(graph)):
            if [i,j] in graph and [j,k] in graph:
                a = [i,k]
                if a in graph:
                    graph.remove(a)
print(graph)    

我希望这可以帮到你。