我在关于调度课程的leetcode上做了一个问题(https://leetcode.com/problems/course-schedule/description/#=)
但出于某种原因,我似乎真的很困惑自己 . 我相信这个问题等同于确定它作为图形的表示是否具有拓扑排序 . 但是只有有向非循环图才能进行拓扑排序 - 所以我们要么必须事先检查它是否有一个循环,要么在搜索它并执行拓扑排序时检查它是否有循环 .
发布的使用DFS的解决方案之一如下:
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] graph = new ArrayList[numCourses];
for(int i=0;i<numCourses;i++)
graph[i] = new ArrayList();
boolean[] visited = new boolean[numCourses];
for(int i=0; i<prerequisites.length;i++){
graph[prerequisites[i][1]].add(prerequisites[i][0]);
}
for(int i=0; i<numCourses; i++){
if(!dfs(graph,visited,i))
return false;
}
return true;
}
private boolean dfs(ArrayList[] graph, boolean[] visited, int course){
if(visited[course])
return false;
else
visited[course] = true;;
for(int i=0; i<graph[course].size();i++){
if(!dfs(graph,visited,(int)graph[course].get(i)))
return false;
}
visited[course] = false;
return true;
}
}
看起来它所做的就是检查之前是否已经访问过节点(课程) - 但是之前是否有可能访问过一个节点但是图形中没有一个循环?这段代码如何检查没有循环,以便它知道它有拓扑排序?