如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。
n
算法:
第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。
第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。
如果最后还有未删除顶点,则存在环,否则没有环。
n
算法分析:
由于有m条边,n个顶点。如果m>=n,则根据图论知识可直接判断存在环路。
(证明:如果没有环路,则该图必然是k棵树 k>=1。根据树的性质,边的数目m = n-k。k>=1,所以:m<n)
如果m<n 则按照上面的算法每删除一个度为0的顶点操作一次(最多n次),或每删除一个度为1的顶点(同时删一条边)操作一次(最多m次)。这两种操作的总数不会超过m+n。由于m<n,所以算法复杂度为O(n)
图论中有个定理,如果边数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)
否则,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)