判断无向图中是否有环

2024-12-08 23:54:52
推荐回答(1个)
回答1:

如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。 n算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。 如果最后还有未删除顶点,则存在环,否则没有环。 n算法分析: 由于有m条边,n个顶点。如果m>=n,则根据图论知识可直接判断存在环路。 (证明:如果没有环路,则该图必然是k棵树 k>=1。根据树的性质,边的数目m = n-k。k>=1,所以:m= V) { There is circle } node = queue.dequeue(); if (degree[node] == 0) { V--; } else { E--; V--; degree[list[node]]--; delete node from list[list[node]]; if (degree[list[node]] == 1) { queue.enqueue(list[list[node]]); } } } if (V != 0) There is circle There is no circle } 首先,感谢lyflower在其博客中所做的分析。分析:该方法,算法复杂度不止O(V),首先初始时刻统计所有顶点的度的时候,复杂度为(V + E),即使在后来的循环中E>=V,这样算法的复杂度也只能为O(V + E)。其次,在每次循环时,删除度为1的顶点,那么就必须将与这个顶点相连的点的度减一,并且执行delete node from list[list[node]],这里查找的复杂度为list[list[node]]的长度,只有这样才能保证当degree[i]=1时,list[i]里面只有一个点。这样最差的复杂度就为O(EV)了。 方法二:DFS搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环。该算法的复杂度为O(V)。