【问题标题】:How do I detect multiple overlapping cycles in a directed graph using Depth First Search (DFS)?如何使用深度优先搜索 (DFS) 在有向图中检测多个重叠循环?
【发布时间】:2018-11-10 11:39:04
【问题描述】:

具有重叠循环的有向图的图像

总共有8个周期需要检测:-

1-2-3-4-5-1
1-2-3-6-5-1
1-2-7-6-5-1
1-2-7-4-5-1

1-8-7-6-5-1
1-8-7-4-5-1
1-8-3-4-5-1
1-8-3-6-5-1

我了解如何使用白色、灰色和黑色集以及布尔访问数组/堆栈,但我仍在为逻辑而苦苦挣扎。将不胜感激任何帮助,我不需要详细描述如何编码,只需要如何使用算法(修改后的 DFS)和可能​​的伪代码。再次感谢您抽出宝贵时间。

【问题讨论】:

    标签: java algorithm depth-first-search cycle directed-graph


    【解决方案1】:

    有向图中检测循环的关键是灰色(这意味着正在探索节点及其邻居)。
    如果其中一个邻居与灰色节点有另一个连接,则您有一个循环。
    所以如果一个探索的节点有一个灰色的邻居,你就有一个循环。
    换句话说,如果一个节点在其所有邻居都被探索之前被重新访问,那么您就有一个循环。

    【讨论】:

    • 感谢 c0der !我明白这一点,但它仍然没有解释算法如何检测这 8 个周期,因为有很多重叠。我以 1 为起点运行了 DFS 算法,虽然它设法搜索整个图,但我不太确定如何从算法中提取 8 个周期。我可以根据随机节点选择识别 1 个循环,但之后当所有顶点均为黑色时搜索结束,而没有给我其余的循环
    • “搜索整个图” 是关键。假设第一个 dfs 路径是 1-2-3-4-5 ,当您到达 5 并发现它有一个灰色邻居 (1) 时,您存储找到的循环 (1-2-3-4-5-1)。然后你回溯并继续搜索,直到找到下一个循环。
    • 是的,搜索整个图表。但也在回溯时清除已访问状态。 这样,当您第二次到达节点 5 (1-2-3-6-5) 时,您会继续到节点 1 并找到第二个循环,以此类推开。
    • 回溯时,如果我清除访问状态,即将节点的颜色改回白色,那么该节点不会再次变为未探索状态。因此,在前向跟踪时,它将再次搜索相同的路径,因为除节点 1 之外的节点都已更改回 WHITE。例如,检测到的第一个周期是 1-2-3-4-5-1。然后我们将 1 到 5 回溯到 4 到 3,并将 5 和 4 的颜色从 GREY 改回 WHITE。那么从节点 3 开始,当我们寻找未探索的节点时,会不会因为它的颜色变回白色而再次找到节点 4?
    • 抱歉,我还不能将问题标记为已回答。我对算法开发相当陌生,所以请与我交谈。
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2012-10-15
    相关资源
    最近更新 更多