
1 BFS拓扑排序
class Solution {
public:
vector<vector<int>> edges;
vector<int> indegree;
vector<int> res;
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
indegree.resize(numCourses, 0);
for (auto edge : prerequisites) {
edges[edge[1]].push_back(edge[0]);
indegree[edge[0]]++;
}
queue<int> q;
for (int i = 0; i < indegree.size(); i++)
if (indegree[i] == 0) q.push(i);
while (!q.empty()) {
int v = q.front(); q.pop();
res.push_back(v);
for (auto& subv : edges[v]) {
indegree[subv]--;
if (indegree[subv] == 0)
q.push(subv);
}
}
if (res.size() == numCourses) return res;
return {};
}
};

2 DFS拓扑排序

class Solution {
public:
vector<vector<int>> edges;
vector<int> visited;
vector<int> res;
stack<int> stk;
bool vaild = true;
void dfs(int v) {
visited[v] = 1;
for (auto& subv : edges[v]) {
if (visited[subv] == 1) {
vaild = false;
return;
} else if (visited[subv] == 0) {
dfs(subv);
if (!vaild) return;
}
}
visited[v] = 2;
stk.push(v);
}
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
visited.resize(numCourses, 0);
for (auto& edge : prerequisites)
edges[edge[1]].push_back(edge[0]);
for (int i = 0; i < numCourses; i++) {
if (visited[i] == 0) dfs(i);
if (!vaild) return {};
}
while (!stk.empty()) {
res.emplace_back(stk.top());
stk.pop();
}
return res;
}
};
