在一些经典算法中,经常需要判断一些图是否具有环路,比如拓扑排序,需要在最初判断该图是否有环路,如有有环路,则无法找到最长的一条线,比如dijkstra算法,每找到一条最短的边,都要判断找到的边和现有的树是否已经构成了环路。
因此,在这篇博客,我们重点来说一个判断图是否有环的算法。
首先我们介绍一个对于无向图和有向图通用的算法,先讲算法思路:
1.统计各个图中各个点的入度数(能够到达这个点的点的数量)。
2.然后找出入度数为0的点(无向图找入度数为1的点)。
3.删除入度数为0的点,将其边也删除。
4.重复2,直到所有点入度都为0,则为无环图,如果找不到入度为0的点,则为有环图。
该算法的精髓在于对于一个环路(以有向图为例),1->2,2->3,3->1,你会发现找不到一个入度为0的点,因此这个方法是可行的。
对于无向图和有向图来说,这个算法是通用的。在这我只写了对于有向图的判断的算法,具体的实现代码如下:
#include
using namespace std;
int graph[100][100];//用来存储图的数组
bool isVisited[100];//判断这个点是否已经删除
int main()
{
int n,e;
while (scanf("%d",&n)!=EOF&&n!=0)//获取点数
{
for(int