#判断图的回路问题

UNIXwlc 2004-12-23 01:40:58
请教大家一个问题! 是一DS课本后的习题。
问题描述:写一算法,判断N个顶点的图(包括有向图、无向图)中是否含有回路,要求编写的算法时间复杂度为O(N).

我开始按照基于图的遍历的思路来做,结果时间复杂度就是降不下来。不知大家有没有基于遍历的符合要求的算法。

我自己还有一个思路,就是通过判断某个连通分支中顶点数和边数的关系,不过连通分支判断花去不少时间。

大家有什么好的算法,烦请指导! 谢谢!
...全文
200 点赞 收藏 7
写回复
7 条回复
jaredcsdn 2004年12月31日
这个问题要想O(N)完成是不太可能的

这里有个变通的办法,不过是O(n^3)

先把图转成邻接矩阵(1/0),做一次Warshall算法,如果对角线上有1,就说明有回路
回复 点赞
UNIXwlc 2004年12月30日
回复mathe():
基于图的遍历的时间复杂度是O(|V|+|E|),所以我觉得O(N)不很准确。
具体参考《数据结构与算法》许卓群、张铭 高教版

这个问题我根据第二个思路想了很久,也没有想出好的解决方法,发觉判断连通分支很费时间!



回复 点赞
yishuihan03 2004年12月29日
有没有消除重复回路的算法?想了2个多小时,还没有找到,等待中!!!
回复 点赞
mathe 2004年12月26日
输错了,是不可能在O(N)的时间内完成,除非已知边的数目同N同阶
回复 点赞
mathe 2004年12月26日
时间复杂度O(N)不肯定,应该是O(E),E是边的数目。
回复 点赞
lyff8neo 2004年12月25日
那么要把所以的回路都要输出呢,我看了一个算法好像要非常复杂的
回复 点赞
mathe 2004年12月23日
很简单,首先对于每个顶点x,添加一个参数visit[x]
就是深度优先遍历一次就可以了,
对于无向图,如果有某个点被两次以上访问到,那么就存在回路。
对于有向图,在深度优先遍历中,如果某个顶点的一个孩子是它的祖先,就存在回路了。
回复 点赞
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.0w+

社区成员

3.4w+

社区内容

数据结构与算法相关内容讨论专区
社区公告
暂无公告