题目
Leetcode 207. 课程表
代码(首刷看解析)
class Solution {
public:
bool hasCycle;
vector<bool> onPath;
vector<bool> visited;
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
auto map = build(numCourses, prerequisites);
visited.resize(numCourses, false);
onPath.resize(numCourses, false);
for(int i = 0; i < numCourses; i++) {
traverse(map, i);
}
return !hasCycle;
}
void traverse(vector<vector<int>>& graph, int s) {
if(onPath[s])
hasCycle = true;
if(visited[s] || hasCycle)
return;
visited[s] = true;
onPath[s] = true;
for(int t : graph[s]) {
traverse(graph, t);
}
onPath[s] = false;
}
vector<vector<int>> build(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> map(numCourses);
for(auto& edge : prerequisites) {
map[edge[1]].push_back(edge[0]);
}
return map;
}
};
代码(10.1 二刷看解析)
class Solution {
public:
vector<vector<int>> edges;
vector<int> indeg;
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
indeg.resize(numCourses);
for(auto& info : prerequisites) {
edges[info[1]].push_back(info[0]);
indeg[info[0]]++;
}
queue<int> q;
for(int i = 0; i < numCourses; i++) {
if(indeg[i] == 0) {
q.push(i);
}
}
int visited = 0;
while(!q.empty()) {
visited++;
int u = q.front();
q.pop();
for(int v : edges[u]) {
indeg[v]--;
if(indeg[v] == 0)
q.push(v);
}
}
return visited == numCourses;
}
};