Найдите самый длинный путь в DAG с помощью Networkx в Python

У меня очень большой DAG строк (~ 200 тыс.). Я хотел бы найти самый длинный путь, который существует в этом графе. В приведенном ниже коде показано, как я настроил график (из списка строк new_list).

#create new empty graph
g = nx.DiGraph()

#add all words to graph
for word in new_list:
    g.add_node(word)

#fill graph with valid word chains
for word in g.nodes():
    for c in string.ascii_lowercase:
        new_word = alphagramatize(word+c) #add char c to word in alphagram order
        if(binary_search(new_list, new_word) != -1):
            g.add_edge(word, new_word)

Я попытался использовать наивный подход проверки расстояния пути от каждого узла до каждого другого узла... это явно нецелесообразно и не завершится.

Я также попытался переработать код longest_path() из этого потока. , но безрезультатно.

Я много читал о том, что я мог понять о выполнении топологической сортировки и упорядочении графа, но у меня возникли проблемы с реализацией этого. Networkx предоставляет функцию topological_sort(g), так что работа сделана за меня. Однако, что мне теперь делать, когда у меня есть график с сортировкой topo_sorted?


person Forerunner117    schedule 22.10.2013    source источник
comment
Что не работает с кодом в stackoverflow.com/questions/17985202/?   -  person Aric    schedule 22.10.2013
comment
@Aric Кажется, на моем графике выводится только один узел с расстоянием. Я ищу весь путь (все узлы на самом длинном пути). Я заметил, что ваш добавляет пути (G.add_path()), а не ребра, как у меня (G.add_edge()). Должен ли я переработать свой код, чтобы генерировать пути, а не ребра?   -  person Forerunner117    schedule 22.10.2013
comment
Без добавления краев все в порядке. Я обновил этот ответ (надеюсь) исправленной версией :-). Это было глубоко неправильно, за исключением особого случая, на котором я его проверял...   -  person Aric    schedule 23.10.2013
comment
@Aric Ваш обновленный код творит чудеса! Спасибо, сэр!   -  person Forerunner117    schedule 23.10.2013