- vector visited(numCourses,0);// 0:未访问,1:访问中,2:访问过无环
- 在哪里断掉 这个节点就可以设置为2
- 特别注意 要使用引用&,dfs 函数中传递了 graph 和 visited 向量的副本,这会导致大量的拷贝操作,增加了时间复杂度。
class Solution {
public:
bool dfs(vector<vector<int>> &graph,vector<int >&visited,int node){
if(visited[node]==1) return false;
if(visited[node]==2) return true;
visited[node]=1;
for(auto ans:graph[node]){
if(!dfs(graph,visited,ans))
return false;
}
visited[node]=2;
return true;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> graph(numCourses);
int n=prerequisites.size();
if(n==0) return true;
for(int i=0;i<n;i++){
graph[prerequisites[i][0]].push_back(prerequisites[i][1]);
}
vector<int> visited(numCourses,0);// 0:未访问,1:访问中,2:访问过无环
for(int i=0;i<numCourses;i++){
if(!dfs(graph,visited,i))
return false;
}
return true;
}
};