您的位置:首页 > 其它

一道笔试程序设计题

2009-11-27 00:51 211 查看

一道笔试程序设计题

有一个无向图,写一个函数判断图中是否存在回路。
函数原型如下:
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 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)

# re: 一道笔试程序设计题 2009-05-07 17:39 gaofeng
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: