一道笔试程序设计题 有一个无向图,写一个函数判断图中是否存在回路。 函数原型如下: int ring(int[][] array, int n, int k) n为图中的顶点数,k为图中的边数,array其实是一个k行2列的二维数组,其中的元素比如(0,1)表示顶点0和顶点1之间存在边。 图中如果存在回路,函数返回1,否则返回0。 不知哪位大牛给高效地实现一下。 posted on 2009-05-06 22:29 蒋耘 阅读(2372) 评论(3) 编辑 收藏 所属分类: 求职 评论 图论中有个定理,如果边数m >= 顶点数n,则必定存在回路否则,m<n时,就要写程序判断了。如果有环路,则存在一个子图,构成一条回路,回路上的每个节点的度数>=2,所以,凡是度数<2的顶点和该回路不搭界,可以迭代地去掉他们。算法如下:V = vertex setE = edge set设原图为G初始化V = {G中所有度数小于2的顶点}定义E(V) 为 与V中的顶点相关的边while V is not emptyv = Next(V)delete v and E(v) from Gupdate G;//改变和v点相连的顶点的度数将所有去掉v后度数变成<2的顶点加入Vend whileif G if empty没有回路else有回路具体实现时,V可以是队列这个算法的复杂度是O(n+m),n是顶点个数,m是边个数,m<n,所以复杂度是O(n) # re: 一道笔试程序设计题 2009-05-07 17:39 gaofeng
评论
图论中有个定理,如果边数m >= 顶点数n,则必定存在回路
否则,m<n时,就要写程序判断了。
如果有环路,则存在一个子图,构成一条回路,回路上的每个节点的度数>=2,所以,凡是度数<2的
顶点和该回路不搭界,可以迭代地去掉他们。
算法如下:
V = vertex set
E = edge set
设原图为G
初始化V = {G中所有度数小于2的顶点}
定义E(V) 为 与V中的顶点相关的边
while V is not empty
v = Next(V)
delete v and E(v) from G
update G;//改变和v点相连的顶点的度数
将所有去掉v后度数变成<2的顶点加入V
end while
if G if empty
没有回路
else
有回路
具体实现时,V可以是队列
这个算法的复杂度是O(n+m),n是顶点个数,m是边个数,m<n,所以复杂度是O(n)