我在编写一个算法,用于返回无向图上形成简单循环的所有路径,但是遇到了一些问题。
首先,我考虑从顶点A开始所有的循环,对于下面的图来说,这将是:
A,B,E,G,F A,B,E,D,F A,B,C,D,F A,B,C,D,E,G,F
其他的循环包括:
B,C,D,E F,D,E,G
但是这些可以通过再次调用算法,从B和D开始分别找到。
我的当前方法是从A开始构建所有可能的路径,访问A的所有邻居,然后访问邻居的邻居等等,同时遵循以下规则:
每当存在多个邻居时,就会发现一个分叉,并创建并探索一个从A开始的新路径。 如果任何一个创建的路径访问原始顶点,则该路径为循环。 如果任何一个创建的路径两次访问同一个顶点(与A不同),则该路径被丢弃。 继续直到所有可能的路径都被探索完毕。
我目前遇到的问题是如何避免找到相同的循环超过一次,我正在尝试通过查看新邻居是否已经是另一个现有路径的一部分来解决这个问题,以便如果它们是独立的,则合并这两条路径会组成一个循环。
我的问题是:我是否在遵循解决此问题的正确/更好/更简单的逻辑?
感谢您的评论。
首先,我考虑从顶点A开始所有的循环,对于下面的图来说,这将是:
A,B,E,G,F A,B,E,D,F A,B,C,D,F A,B,C,D,E,G,F
其他的循环包括:
B,C,D,E F,D,E,G
但是这些可以通过再次调用算法,从B和D开始分别找到。
我的当前方法是从A开始构建所有可能的路径,访问A的所有邻居,然后访问邻居的邻居等等,同时遵循以下规则:
每当存在多个邻居时,就会发现一个分叉,并创建并探索一个从A开始的新路径。 如果任何一个创建的路径访问原始顶点,则该路径为循环。 如果任何一个创建的路径两次访问同一个顶点(与A不同),则该路径被丢弃。 继续直到所有可能的路径都被探索完毕。
我目前遇到的问题是如何避免找到相同的循环超过一次,我正在尝试通过查看新邻居是否已经是另一个现有路径的一部分来解决这个问题,以便如果它们是独立的,则合并这两条路径会组成一个循环。
我的问题是:我是否在遵循解决此问题的正确/更好/更简单的逻辑?
感谢您的评论。