🔗 https://leetcode.cn/problems/course-schedule
题目
- 有 n 门课程,有若干课程的依赖,[a, b] 表示,b 是 a 的先修课,需要先修 b,才能修 a
- 判断是否可以完成 n 门课程的学习
思路
- 先把课程依赖转化成邻接表
- dfs 判断每个课程是否有循环依赖
代码
class Solution {
public:
vector<vector<int>> adj;
vector<bool> visited, finished;
bool check(int index) {
if (visited[index] == true) return finished[index];
visited[index] = true;
bool ans = true;
for (int i = 0; i < adj[index].size(); i++) {
if (check(adj[index][i]) == false) {
ans = false;
break;
}
}
finished[index] = ans;
return ans;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
adj.resize(numCourses);
visited.resize(numCourses);
finished.resize(numCourses);
for (int i = 0; i < prerequisites.size(); i++) {
int a = prerequisites[i][0];
int b = prerequisites[i][1];
adj[a].push_back(b);
}
for (int i = 0; i < numCourses; i++) {
if (check(i) == false) return false;
}
return true;
}
};