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