2016-08-24 4 views
0

私はAcyclicグラフの推移的減少を行うコードを書こうとしています。 だから要素は次のとおり推移の減少 - コードでのエラー - Python

(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:グラフの冗長なエッジが除去されています。例えば、AがBに接続され、BがCに接続されている場合、Aは(A→B)と(B→C)また、Cに接続されているため、 (A - > C)は冗長です.AはCからBに到達できるため、削除する必要があります。

+0

dfsツリーに興味があるかもしれません。それはGoogleです。 – sashas

答えて

1

コードが改善されましたが、場合によってはTranstive reductionが表示され、要素[i、k]が存在しないため、条件を追加しましたif a in graph:また、関数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)  

私はこれがあなたを助けることを望みます。

+0

@Javieryesその完璧なこと..もう1つ、私はこのグラフを描画すると、私は3が1から5と2に達することができるので、(3,1)も冗長であることがわかります。しかし、 (3,1)。とにかくそれで私を助けることができますか? – user3624406