LeetCode:210. 课程表 II
class Solution {
public:
vector<int> postorder;
bool hasCycle = false;
vector<bool> visited, onPath;
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
// 使用引用传递,避免拷贝
vector<vector<int>> graph = buildGraph(numCourses, prerequisites);
visited = vector<bool>(numCourses, false);
onPath = vector<bool>(numCourses, false);
for (int i = 0; i < numCourses; i++) {
if (!visited[i]) {
traverse(graph, i);
}
}
if (hasCycle) {
return vector<int>();
}
reverse(postorder.begin(), postorder.end());
return postorder;
}
void traverse(vector<vector<int>>& graph, int s) {
if (onPath[s]) {
hasCycle = true;
return;
}
if (visited[s] || hasCycle) {
return;
}
onPath[s] = true;
visited[s] = true;
for (int t : graph[s]) {
traverse(graph, t);
}
postorder.push_back(s);
onPath[s] = false;
}
vector<vector<int>> buildGraph(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> graph(numCourses);
for (auto& edge : prerequisites) {
int from = edge[1], to = edge[0];
graph[from].push_back(to);
}
return graph;
}
};