我有一个连接的,非定向的图,有N个节点和2N-3边。您可以考虑将图形构建到现有的初始图形上,该图形具有3个节点和3个边缘。每个节点都添加到图表上,并与图中的现有节点有2个连接。当所有节点都添加到图形中时(总共添加N-3个节点),构建最终图形。
最初我问过,这个图中最多可以访问一次的节点数是多少(初始节点除外),即最大哈密顿路径中包含的最大节点数是多少给定图表? (好吧,说最大哈密顿路径不是一个有效的短语,但考虑到问题的本质,我需要找到一次访问的最大节点数,并且行程在初始节点结束.I认为它可以被认为是一个哈密顿量的子图,并且包含最大节点数,因此最大可能的哈密顿路径。
由于我没有被要求找到路径,我应该首先检查是否存在给定数量节点的哈密顿路径。我知道平面图和cycle graph s(C n )是哈密顿图(我也知道汉密尔顿图的Ore's theorem,但我将要研究的图不会是一个概率很大的密集图,因此在我的案例中,使得Ore定理几乎没用。因此,我需要找到一种算法来检查图是否是循环图,即是否存在包含给定图的所有节点的循环。
由于DFS用于检测周期,我认为对DFS的一些小操作可以帮助我检测我正在寻找的内容,如跟踪探索的节点,最后检查访问的最后一个节点是否与初始节点。不幸 我无法用这种方法取得成功。
我尝试的另一种方法是排除节点,然后尝试从其他相邻节点开始到达其相邻节点。根据所选择的相邻节点,该算法可能无法给出正确的结果。
我几乎被困在这里。你能帮我想一下另一个算法来告诉我图是一个循环图吗?
修改
我在评论的帮助下意识到了(非常感谢你):
循环图由单个循环组成,具有N个边和N个顶点。如果存在包含给定图的所有节点的循环,则该循环是哈密顿循环。 - n.m。
我实际正在搜索汉密尔顿路径,我不打算这样做:) 再想一想,我认为在构建图形时检查图的哈密顿特性会更有效,我也在寻找:时间效率。
经过一番思考,我认为无论节点数量多少,由于节点添加标准,图形似乎都是哈密顿量。问题是我无法确定,我无法证明这一点。以这种方式添加节点,即添加具有将添加的节点连接到现有节点的2条边的新节点,是否会改变图的哈密顿特性?如果它没有改变汉密尔顿属性,那怎么回事?如果它确实改变了,那又如何呢?感谢。
编辑#2
我再次意识到,按照我描述的方式构建图形可能会改变哈密尔顿属性。考虑如下输入:
1 3
2 3
1 5
1 3
这些输入表示第4个节点连接到节点1和节点3,第5个节点连接到节点2和节点3。 。
第4和第7个节点连接到相同的节点,从而将可以访问的最大节点数减少一次,如果我检测到这些冲突( NOT 包括输入,如3 3,这是你建议的一个例子,因为问题表明新添加的边连接到 2个其他节点)并且从N开始降低最大节点数,我相信我可以得到正确的结果。
看,我不选择连接,它们是给我的,我必须找到最大值。节点数。
我认为在构建图形时计算相同的连接并从N中减去相同连接的数量会得到正确的结果吗?你能证实这个或者这个算法有缺陷吗?
答案 0 :(得分:1)
我们在此问题中遇到的是connected, non-directed
图表,其中 N 个节点和 2N-3 边缘。考虑下面给出的图表,
A
/ \
B _ C
( )
D
图表没有哈密顿循环。但是Graph的构造符合您添加节点的规则。因此,搜索哈密顿循环可能无法为您提供解决方案。即使有可能汉密尔顿循环检测是 NP-Complete 问题, O(2 N )复杂性。所以这种方法可能并不理想。
我建议使用Floyd's Cycle Finding algorithm
的修改版本(也称为Tortoise and Hare
算法)。
修改后的算法是,
1. Initialize a List CYC_LIST to ∅.
2. Add the root node to the list CYC_LIST and set it as unvisited.
3. Call the function Floyd() twice with the unvisited node in the list CYC_LIST for each of the two edges. Mark the node as visited.
4. Add all the previously unvisited vertices traversed by the Tortoise pointer to the list CYC_LIST.
5. Repeat steps 3 and 4 until no more unvisited nodes remains in the list.
6. If the list CYC_LIST contains N nodes, then the Graph contains a Cycle involving all the nodes.
该算法最多可以调用Floyd的循环查找算法2N次。 Floyd的Cycle Finding算法需要一个线性时间(O(N))。因此,修改算法的复杂性为 O(N 2 ),这比基于哈密顿循环的方法所采用的指数时间要好得多。
这种方法可能存在的一个问题是它会检测closed paths
以及周期,除非实施更严格的检查标准。
回复编辑#2
考虑下面给出的图表,
A------------\
/ \ \
B _ C \
|\ /| \
| D | F
\ / /
\ / /
E------------/
根据您的算法,此图表没有包含所有节点的循环。 但是这个图中有一个包含所有节点的循环。
A-B-D-C-E-F-A
所以我认为你的方法存在一些缺陷。但是假设你的算法是正确的,它远比我的方法好。由于我的 O(n 2 )时间,因此只需 O(n)。
答案 1 :(得分:0)
为此线程添加一些说明:找到哈密顿循环是NP完全的,这意味着找到一个最长的循环也是NP完全的,因为如果我们可以在任何图中找到最长的循环,我们就可以找到哈密顿循环由该顶点上的顶点引起的子图。 (另请参阅例如关于最长周期问题的this paper)
我们不能在这里使用狄拉克的标准:狄拉克只告诉我们minimum degree >= n/2 -> Hamiltonian Cycle
,这就是我们需要的相反方向的含义。相反的方法肯定是错误的:在n
个顶点上进行一个循环,其中的每个顶点都精确度为2,无论圆的大小如何,但它有一个HC。从狄拉克可以看出的是no Hamiltonian Cycle -> minimum degree < n/2
,这里没有用,因为我们不知道我们的图是否有HC,所以我们不能使用暗示(尽管如此我们构建的每个图所描述的OP将具有度2
的顶点,即添加到图形的最后一个顶点,因此对于任意n
,我们具有最小度2
)。
问题在于,您可以构建具有HC的任意大小的图形和没有HC的任意大小的图形。对于第一部分:如果原始三角形是A,B,C并且添加的顶点编号为1到k,则将第一个添加的顶点连接到A和C,将第k + 1个顶点连接到A和第k个所有k的顶点&gt; = 1.循环为A,B,C,1,2,...,k,A
。对于第二部分,将顶点1和2连接到A和B;该图表没有HC。
值得注意的是,在施工期间,具有HC的特性可以从一个顶点变为另一个顶点。您可以在添加顶点时创建和销毁HC属性,因此每次添加顶点时都必须检查它。一个简单的例子:在添加第一个顶点后获取图形,并将第二个顶点和边缘添加到第一个顶点所连接的三角形的相同两个顶点。这由具有HC的图形构成,没有HC的图形。反过来说:现在添加第3个顶点并将其连接到1和2;这是从没有HC的图形构建的,具有HC的图形 在施工期间存储最后已知的HC并不能真正帮助您,因为它可能会完全改变。在添加第20个顶点之后你可以有一个HC,然后在[21,2000]中没有一个用于k,并且在2001d顶点中添加了一个。很可能你在23个顶点上使用的HC对你没什么帮助。
如果您想了解如何有效解决这个问题,您必须找到适用于所有图表的标准,以便有效地进行检查。否则,您的问题在我看来并不比一般情况下的哈密尔顿循环问题简单,因此您可以将其中一个算法used for that problem调整为您的变体。
答案 2 :(得分:0)
下面我在原始图中添加了三个额外的节点(3,4,5),看起来我可以无限期地添加新节点,同时保持哈密顿循环的属性。对于下图,周期为0-1-3-5-4-2-0
1---3---5
/ \ / \ /
0---2---4
由于没有关于如何添加具有两个边的新节点的额外限制,我认为通过构造,您可以拥有一个包含哈密顿周期属性的图。