设计一种算法来查找 d 正则图中简单循环的长度
Designing an Algorithm to find the length of a simple cycle in a d-regular graph
我大致看懂了题型,但不知道题中的算法是如何设计和分析的。我正在考虑应用某种图形搜索算法,如深度优先/广度优先搜索。
更新:这是我尝试过的方法,从图中的任何节点(称之为 N)开始,访问该节点的 d 个邻居中的每一个。现在,我们刚刚访问过的 N 的最后一个邻居(称之为 L)访问了 L 的任何其他不是 N 的邻居?
其他人已经在评论中暗示了可能的解决方案,让我们详细说明。当 d<=1
时,解决方案是立竿见影的(并且取决于您对循环的确切定义),所以我假设 d>1
。
一个这样的算法是:
- 构建一条从任意顶点
V
开始的路径。在路径长度为 d
之前,不要允许您已经访问过的顶点。
- 一旦路径长
d
个顶点,继续向路径添加顶点,但现在只允许与路径的最后 d
个顶点不同的顶点。
- 添加路径中已使用的顶点时,请停止。您从在该顶点开始和结束的路径段创建生成的循环。
在(1)和(2)中,这样一个顶点的存在由G是d正则的事实来保证。在搜索要添加的顶点时,我们只排除最后 d
个顶点,即最后一个顶点 (U
) 及其前身 d-1
个。你有 d
个邻居,因此必须至少有一个邻居可用。
算法将停止,因为条件 (3) 和 G 是有限的事实。
优先选择 (2) 中已经访问过的顶点是有意义的,但它不会改变最坏情况下的复杂度。
这给了我们最坏情况下的复杂度 n*d
- 因为我们可能必须访问每个顶点并检查其所有边。
我大致看懂了题型,但不知道题中的算法是如何设计和分析的。我正在考虑应用某种图形搜索算法,如深度优先/广度优先搜索。
更新:这是我尝试过的方法,从图中的任何节点(称之为 N)开始,访问该节点的 d 个邻居中的每一个。现在,我们刚刚访问过的 N 的最后一个邻居(称之为 L)访问了 L 的任何其他不是 N 的邻居?
其他人已经在评论中暗示了可能的解决方案,让我们详细说明。当 d<=1
时,解决方案是立竿见影的(并且取决于您对循环的确切定义),所以我假设 d>1
。
一个这样的算法是:
- 构建一条从任意顶点
V
开始的路径。在路径长度为d
之前,不要允许您已经访问过的顶点。 - 一旦路径长
d
个顶点,继续向路径添加顶点,但现在只允许与路径的最后d
个顶点不同的顶点。 - 添加路径中已使用的顶点时,请停止。您从在该顶点开始和结束的路径段创建生成的循环。
在(1)和(2)中,这样一个顶点的存在由G是d正则的事实来保证。在搜索要添加的顶点时,我们只排除最后 d
个顶点,即最后一个顶点 (U
) 及其前身 d-1
个。你有 d
个邻居,因此必须至少有一个邻居可用。
算法将停止,因为条件 (3) 和 G 是有限的事实。
优先选择 (2) 中已经访问过的顶点是有意义的,但它不会改变最坏情况下的复杂度。
这给了我们最坏情况下的复杂度 n*d
- 因为我们可能必须访问每个顶点并检查其所有边。