场景:我有一个图表,表示为节点集合(0 ... n)。此图表中没有边缘。
在此图中,我一次一个地连接节点。另一种说法是我将随机边缘添加到图表中,一次一个。
我不想在此图中创建简单的循环。
当我添加随机边时,是否有一种简单和/或非常有效的方法来跟踪周期的创建?使用图形遍历,很容易,因为我们只需要跟踪单个路径的两个端节点。但是,在这种情况下,我们需要跟踪任意数量的路径 - 有时这些路径会组合成一条更大的路径,我们也需要跟踪它。
我已经尝试了几种方法,主要归结为维护一个“外部节点”列表和一组内部节点,然后当我添加一条边经过并更新它时。但是,它变得非常复杂,特别是如果我删除图中的边缘。
我试图搜索算法或讨论,我真的找不到任何东西。我知道我可以做一个BFS来检查周期,但是在每次添加边缘后它对BFS来说都是非常低效的。
答案 0 :(得分:1)
我在淋浴时想出了可能的解决方案。
我要做的是维护一个大小为n的列表,表示该节点在边缘上的次数。
当我添加边(i,j)时,我将增加list [i]和list [j]。
如果在边缘添加之后,列出[i]> 1,列表[j]> 1,我将从那个边缘开始做DFS。
我意识到我不需要BFS,我只需要从最后添加的边缘获得DFS,而且如果它至少有可能处于一个周期中我只需要这样做(它是's' s节点出现两次)。
我怀疑它是最优的......也许某种不相交的列表会更好。但这比我之前想到的任何事情都要好。
答案 1 :(得分:1)
如果您跟踪图形的连接组件,则无论相关节点是否已在同一组件中,您都可以测试插入的每个边缘。如果是,则插入的边将为图形引入一个循环。
看看这篇文章似乎就如何做到这一点提供了一些很好的参考:https://cstheory.stackexchange.com/questions/2548/is-there-an-online-algorithm-to-keep-track-of-components-in-a-changing-undirecte