用于在图中查找闭合路径的伪代码

时间:2009-03-14 19:38:55

标签: algorithm graph-theory pseudocode

我有一个图的邻接矩阵,它通过在相应的adjMat [i,j] = 1中得到1来跟踪节点之间的边缘; 通过该adjaceny矩阵,我希望找出图中存在的所有长度为4的闭合路径。谁能请我提供伪代码。谢谢你

3 个答案:

答案 0 :(得分:2)

这听起来像是家庭作业,所以我不会放弃整件事。但这里有一个提示:因为你有兴趣找到长度为4的周期,取邻接矩阵的4次幂并沿对角线扫描。如果任何条目M [i,i]非零,则存在包含顶点i的循环。

答案 1 :(得分:1)

也许它不是计算它的最佳方式(它是O(n^4)),但是一种非常简单的方法是扫描所有顶点

a, b, c, d such that b > a, c > b, d > c

您可以检查然后检查以下每个周期:

 1. ([a,b] && [b,c] && [c,d] && [d,a])
 2. ([a,b] && [b,d] && [d,c] && [c,a]) 
 3. ([a,d] && [d,b] && [b,c] && [c,a])

 1:         2:        3:
 A---B      A---B     A   B
 |   |       \ /      |\ /|
 |   |        X       | X |
 |   |       / \      |/ \|
 D---C      D---C     C   D

你基本上检查每个有序的顶点集(a,b,c,d),它们可以形成一个循环。

所以伪代码是:

for a = 0 to <lastVertex>
 for b = a + 1 to <lastVertex>
  for c = b + 1 to <lastVertex>
   for d = c + 1 to <lastVertex>

    if(IsCycle(a,b,c,d)) AddToList([a,b,c,d])
    if(IsCycle(a,b,d,c)) AddToList([a,b,d,c])
    if(IsCycle(a,c,b,d)) AddToList([a,c,b,d])

   next d
  next c
 next b    
next a

答案 2 :(得分:0)

对每个节点应用深度限制深度优先搜索,并记录DFS找到起始节点的节点。 有关搜索,请参阅此处的伪代码:http://en.wikipedia.org/wiki/Depth-limited_search。你只需要添加像

这样的东西
if(node' == node && node'.depth==4) memorize(node)

到循环的开头。