判断图是否有环
无向图:
- 转自http://blog.csdn.net/lyflower/archive/2008/03/01/2137710.aspx。
- 如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=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)
有向图:
通过无向图的分析,我们应该清楚有向图跟无向图是类似的。如果一个有向图所有的点均有入度,说明该图是存在环的,所以,每次把入度为0的点及对应的边去掉,并更新该边对应的顶点的入度,反复操作,如果仍然存在边,说明该图存在环。
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号