嘿伙计们,我需要输出一个给定图形的周长,表示为邻接矩阵。有人可以给我一些提示,我可以使用邻接矩阵或邻接列表来获得图形的周长吗?感谢
示例:
graph one:
0 1 0 0
1 0 0 1
0 0 0 0
0 1 0 0
graph two:
0 1 0 0 1
1 0 1 0 0
0 1 0 1 0
0 0 1 0 1
1 0 0 1 0
The result:
Girth of graph 1: infinity
Girth of graph 2: 5
答案 0 :(得分:7)
基于BFS的http://webcourse.cs.technion.ac.il/234247/Winter2003-2004/ho/WCFiles/Girth.pdf算法,复杂度为O(VE)。这适用于无向图(例如,您的示例邻接矩阵是对称的)。另请参阅https://github.com/jaspervdj/Genus/blob/master/src/genus/FindGirth.java。
答案 1 :(得分:3)
该算法将找到最短周期的长度:
- set `girth` to infinity
- for each edge
-- remove the edge from the graph
-- measure the distance between the edge endpoints
-- if `girth` is longer than distance+1
--- set `girth` to distance+1
-- return the edge to the graph.
时间复杂度为Dijkstra's algorithm为O(v^2)
,因此此算法为O(v^4)
。
如果图表稀疏,您可以转换为邻居列表表示,然后在O(v^2+e*(e+v*log(v)))
= O(v^2+e^2+v*e*log(v))
答案 2 :(得分:1)
如果你从所有点运行dijkstra并且每一轮从给定的源获得最大距离,那么它会更便宜(O(v ^ 3))。然后取出这些元素的最大值,这就是周长。
答案 3 :(得分:1)
图的周长是图中包含的最短周期的长度,即具有最小可能总和的周期(如果图具有负周期,则可以是负的)。 找到周长的最简单方法是在给定图形上运行Floyd Warshall算法(在O(V ^ 3)时间内)(具有V <= 400)并且在2-D阵列中存储每对之间的距离。之后,对于每个可能的顶点(在O(V)时间内)迭代dist [i] [i],检查是否存在以顶点i开始并在顶点i处结束的循环,然后取最小值从dist [i] [i]获得的可能值。
答案 4 :(得分:0)
在Sage
中sage: G1 = Matrix([[0,1,0,0],[1,0,0,1],[0,0,0,0],[0,1,0,0]])
sage: G2 = Matrix([[0,1,0,0,1],[1,0,1,0,0],[0,1,0,1,0],[0,0,1,0,1],[1,0,0,1,0]])
sage: G1 = Graph(G1)
sage: G2 = Graph(G2)
sage: G1.girth()
+Infinity
sage: G2.girth()
5