Algorithm 用DFS求有向图中的最长圈

Algorithm 用DFS求有向图中的最长圈,algorithm,graph-theory,depth-first-search,Algorithm,Graph Theory,Depth First Search,我需要使用DFS在有向图中找到最长的循环 我曾经看过Wikipedia的这篇文章,描述了这样做的方式,我认为它解决了这个问题,比如用三种状态之一标记节点:节点尚未访问,完成了节点搜索,节点已访问,但尚未完成访问 如果有人能与我分享这个链接,我将不胜感激。顺便说一下,这不是Tarjan的算法 下面的问题是我想解决的,如果你想知道的话 第一行中给出的两个数字是N和M,每个数字表示节点数和有向边数 从第二行开始,给出了两个数字A和B的M组,这意味着节点A和B是连接的,但只能从A到B遍历节点 input

我需要使用DFS在有向图中找到最长的循环

我曾经看过Wikipedia的这篇文章,描述了这样做的方式,我认为它解决了这个问题,比如用三种状态之一标记节点:节点尚未访问,完成了节点搜索,节点已访问,但尚未完成访问

如果有人能与我分享这个链接,我将不胜感激。顺便说一下,这不是Tarjan的算法

下面的问题是我想解决的,如果你想知道的话

第一行中给出的两个数字是N和M,每个数字表示节点数和有向边数

从第二行开始,给出了两个数字A和B的M组,这意味着节点A和B是连接的,但只能从A到B遍历节点

input.txt:

7 9  
1 2  
2 3  
3 1  
3 4  
4 5  
5 1  
5 6  
6 7  
7 2  

这个例子的答案是6,因为2>3>4>5>6>7>2。

我认为最长的基本的循环(或电路)比最长的循环更好

无论如何,此pdf可能会有所帮助:

这个长达一年的stackoverflow问题也与相关问题和算法有很多联系:
这个问题是NP完全问题,还没有多项式时间算法。 你的问题有多大?我的意思是在输入图形中有多少节点

最长循环问题简化为哈密顿循环问题:

事实上,可以证明,可以在多项式时间内将哈密顿圈简化为这个问题,因此它最终是NP完全的。无论图形是有向的还是无向的


就算法而言,解决问题的简单方法是回溯——从节点i=1到n开始,并始终探索从特定节点i开始的所有循环。完成此操作后,将删除节点i并从节点i+1开始继续图的其余部分。您可能需要在DFS中执行类似节点着色的操作,以区分您永远不想再次访问的节点和在此特定过程中沿路径访问的节点。您可能还希望在节点上添加时间戳之类的内容,类似于发现时间,但在这种情况下,您需要在每次发现节点时写入这些时间,因为大多数节点都会被发现很多次。上面列出的论文可能会有所帮助,而且肯定有更多的方法可以做到这一点。

我在另一篇文章中给出了一个答案,解释了一种使用Python和networkX在有向图中查找所有循环的简单方法

该解决方案将输出一个包含有向图的所有循环的列表

您可以使用此输出查找最长的循环,如下所示:

import networkx as nx

# Create Directed Graph
G=nx.DiGraph()

# Add a list of nodes:
G.add_nodes_from(["1","2","3","4","5","6","7","9"])

# Add a list of edges:
G.add_edges_from([("7","9"),("1","2"),("2","3"),("3","1"),("3","4"),("4","5"),("5","1"),("5","6"),("6","7"),("7","2")])

#Return a list of cycles described as a list o nodes
all_cycles = list(nx.simple_cycles(G))

#Find longest cycle
answer = []
longest_cycle_len = 0
for cycle in all_cycles:
    cycle_len = len(cycle)
    if cycle_len>longest_cycle_len:
        answer =cycle
        longest_cycle_len = cycle_len

print "Longest Cycle is {} with length {}.".format(answer,longest_cycle_len)
答案:最长周期为['3','4','5','6','7','2'],长度为6


如果你觉得有趣,就把原来的答案也投上去。这是一个有很多答案的老讨论,它将有助于提出新的解决方案。

这不是NP完全吗?如果你能在多项式时间内找到最长的循环,你也能找到图是否包含哈密顿循环。这是NPC问题,但如果你想在DAG中找到一条最长的路径,它就是p,总之你应该说你在做什么,让人们帮你。你可能在想维基百科上关于拓扑排序的文章。虽然,这是一个不同的问题…非常感谢你的这篇论文,我找了好几天的那种算法。当人们说“这是NP,不能做”时,我真的很生气。对于小问题,它可以,我的问题肯定是足够小!第一个链接已断开:(@jamesmithell它在siam.org中(如果你有访问权限的话):在问题中添加了一个链接,指向一个有相同论文的github项目。在那里抓住它;)在构建
所有周期时,你应该避免调用
列表。它所做的只是浪费内存,因为在迭代时不需要整个列表。