DFS判断有向图是否存在环
对一个节点有三种情况,还未访问,正在访问,访问结束
我们用0,1,-1,正在访问表示还在递归中未出来,如果相连节点都正在访问
说明在DFS过程中一条道路上访问了两次同一个节点,这说明有环
下面用代码实现
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if(findOrder(numCourses,prerequisites))
{
return false;
}
else
{
return true;
}
}
int[] state ;
Map<Integer,List<Integer>> map =new HashMap<Integer,List<Integer>>();
void init(int numCourses, int[][] prerequisites)//初始化操作
{
state = new int[numCourses];//存放状态
for(int i=0;i<numCourses;i++)
{
map.put(i,new ArrayList<Integer>());
}
for(int i=0;i<prerequisites.length;i++)
{
map.get(prerequisites[i][1]).add(prerequisites[i][0]);//建立领接列表存储节点
}
}
public boolean findOrder(int numCourses, int[][] prerequisites) {
init(numCourses,prerequisites);
for(int i=0;i<numCourses;i++)
{
if(DFS(i))
return true;
for(int k=0;k<numCourses;k++)
{
state[k]=0;
}
}
return false;
}
boolean DFS(int start)
{
if(state[start]==-1)//防止出现死循环
{
return false;
}
if(state[start]==1)//正在访问
{
return true;
}
else
{
state[start]=1;
for(int i=0;i<map.get(start).size();i++)
{
if(DFS(map.get(start).get(i)))//发现有环,一直往上回退直到退出
return true;
}
state[start]=-1;
}
return false;
}
}