- 拓扑序:在图中从顶点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 --> vdegree[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; // 大顶堆,降序
