1
ノード "a"とノード "o"からすべてのLCAノードを取得したいと考えています。NetworkXを持つすべての最低共通祖先
このDiGraphでは、ノード "l"とノード "m"はLCAノードです。
以下はコードです。
import networkx as nx
def calc_length(Graph, node1, node2, elem):
length1 = nx.shortest_path_length(Graph, node1, elem)
length2 = nx.shortest_path_length(Graph, node1, elem)
length_sum = length1 + length2
return length_sum
G = nx.DiGraph() #Directed graph
G.add_nodes_from(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p"])
edges = [("a","b"),("b","c"),("b","d"),("a","e"),("a","h"),("e","f"),("e","g"),("e","i"),("h","l"),("h","m"),("g","j"),("o","p"),("o","n"),("n","m"),("n","l"),("n","k"),("p","j"),]
G.add_edges_from([(e[0], e[1]) for e in edges])
preds_1 = nx.bfs_predecessors(G, "a")
preds_2 = nx.bfs_predecessors(G, "o")
common_preds = set([n for n in preds_1]).intersection(set([n for n in preds_2]))
common_preds = list(common_preds)
dic ={}
for elem in common_preds:
length_sum = calc_length(G, "a", "o", elem)
dic[elem] = length_sum
min_num = min(dic.values())
for k, v in sorted(dic.items(), key=lambda x:x[1]):
if v != min_num:
break
else:
print k, v
実行速度が向上したい。
前述の問題よりも問題を解決する方法がある場合は、教えてください。
私はあなたの助けに感謝します。
あなたの例は私のためには機能しません。 'preds_1'と 'preds_2'は空で、' a 'と' o 'は先行するものがありません.... – Paul
おそらく' length_2'は 'node_1'ではなく' node_2'に依存するでしょうか? – Paul
すみません。私は間違っていた。 length_2はnode2に依存します。 –