这个题是要求一个有向图里是否存在环。
建立有向图,用二维数组来建立,需要一个一维数组visit来记录访问状态,这里有三种状态,0表示还未访问过,1表示已经访问了,-1表示正在访问,还没有处理完的节点。如果存在一条-1到-1的路,这就是一个环。大体思路是,先建立好有向图,然后从第一个门课开始,找其可构成哪门课,暂时将当前课程标记为-1,然后对新得到的课程调用DFS递归,如果新课程在visit里值为1,说明新课程已经完成,那么第一门课可以不用构成这个新课程,第一门课可以被记为1,直接返回true即可。如果新课程是-1,说明新课程也在等待别的课程把它完成,也就是出现了环,则返回false。
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int> > graph(numCourses, vector<int>(0));
vector<int> visit(numCourses, 0);
for (auto a : prerequisites) {
graph[a.second].push_back(a.first);
}
for (int i = 0; i < numCourses; ++i) {
if (!canFinishDFS(graph, visit, i)) return false;
}
return true;
}
bool canFinishDFS(vector<vector<int> > &graph, vector<int> &visit, int i) {
if (visit[i] == -1) return false;
if (visit[i] == 1) return true;
visit[i] = -1;
for (auto a : graph[i]) {
if (!canFinishDFS(graph, visit, a)) return false;
}
visit[i] = 1;
return true;
}
};