发现图周期-简单说明


9

可以请一些人帮我理解如何用外行术语在图中找到周期吗?

我读过其他问题,例如“ 这一个”以及一些Wikipedia页面,但是它们似乎很快就陷入了数学术语中。

我在Java中有一个图形模型,对节点进行建模以及在“入”和“出”边缘进行建模-该模型知道节点仅在一个方向上连接,这使我能够找到叶节点作为起点,我的计划是以便从每个叶节点的每个“步行”中返回图形,并保留我在路线上找到的所有其他节点的列表。如果我在任何时候都在列表中看到了东西,那我就会知道在图中找到了一个循环。但是,这感觉有点简单。

我确定这是一个已解决的问题,如果可以用简单的术语来解释,那就太好了。

-高手

Answers:


6

我可以想到的最简单的方法是,用外行的术语解释点图周期,就像这样:

  • 首先,我假设您了解图是什么以及节点和边是什么的基础知识。本示例假定您有一个图形,其中所有边都是单向的。
  • 创建图形,然后选择一个节点作为起点。
  • 创建某种容器对象(列表或散列效果最好)。称之为“访问”。
  • 创建第二个容器对象(这里的队列很理想),并将其称为“打开”。
  • 将起始节点添加到“打开”列表中。
  • 在“打开”列表不为空时重复:
    • 从“打开”中删除第一项,并将其命名为“当前”
    • 如果“已访问”中存在“当前”,则您有一个循环。
    • 如果不是,则将Current添加到Visited,然后将Current可以从其出站边缘到达的所有节点添加到Open。
  • 如果“打开”结束时为空且未检测到任何循环,则您没有任何循环。(至少不是在从起点开始的可到达集合中,如果您的图表中有孤岛,则不一定是整个图表。)

0

基本上,您在图形上进行广度优先搜索,并使用哈希图跟踪访问过的节点。

在任何时间点,如果遇到一个已经被访问过的节点(存在于哈希图中),那么您就会知道图中存在一个循环。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.