- 拓扑序:在图中从顶点u到顶点v有一条有向路径,则顶点u一定排在顶点v之前。满足这样的条件的顶点序列称为一个拓扑序。
- 有向无环图:DAG - Directed Acyclic Graph
- 入度:有向图的某个顶点作为终点的次数和。
- 出度:有向图的某个顶点作为起点的次数和。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
unordered_map<int, vector<int>> mp; // 邻接表
vector<int> degree(numCourses, 0); // 入度
for (int i = 0; i < prerequisites.size(); i++) {
int u = prerequisites[i][1];
int v = prerequisites[i][0];
// u --> v
degree[v]++;
mp[u].push_back(v);
}
queue<int> que; // 入度为0的课程,加入队列
for (int i = 0; i < degree.size(); i++) {
if (degree[i] == 0) {
que.push(i);
}
}
vector<int> ans;
int count = 0;
while (!que.empty()) {
int n = que.size();
for (int i = 0; i < n; i++) {
int a = que.front();
que.pop();
ans.push_back(a);
vector<int> tmp = mp[a];
for (int j = 0; j < tmp.size(); j++) {
degree[tmp[j]]--;
if (degree[tmp[j]] == 0) {
que.push(tmp[j]);
}
}
count++;
}
}
if (count < numCourses) { // 有环,不可能完成所有课程
return {};
}
return ans;
}
};
若有些拓扑排序要求字典序最小,可将队列换成优先队列。priority_queue<int> que; // 大顶堆,降序