版权声明:自由转载-非商用-非衍生-保持署名 https://blog.csdn.net/mgsweet/article/details/79001293
解法
解法同上一题,核心思想就是找DAG(有向无环图),算法的思想就是通过bfs不断去削减节点,并寻找入度为0的点,最后判断所有点是否都变为入度为0的点。具体算法如下:
1. 用一个队列维护所有入度为0的节点,每次弹出一个节点v,查看从v可达的所有节点u;
2. 将u的入读减一,若u的入度此时为0, 则将u加入队列。
3. 在队列为空时,检查所有节点的入度,若所有节点入度都为0, 则存在这样的一个拓扑排序 —— 有向图中不存在环。
更多请看:
Leetcode解题笔记 207.Course Schedule 拓扑排序
代码
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int>> map(numCourses);
vector<int> inOrders(numCourses, 0);
vector<int> result(0);
for (auto x : prerequisites) {
inOrders[x.first]++;
map[x.second].push_back(x.first);
}
queue<int> bfs;
for (int i = 0; i < inOrders.size(); i++) {
if (inOrders[i] == 0) {
bfs.push(i);
result.push_back(i);
}
}
while (!bfs.empty()) {
for (auto x : map[bfs.front()]) {
inOrders[x]--;
if (inOrders[x] == 0 && find(result.begin(), result.end(), x) == result.end()) {
bfs.push(x);
result.push_back(x);
}
}
bfs.pop();
}
for (auto x : inOrders) {
if (x != 0) return *new vector<int>(0);
}
return result;
}
};
这类博客更多是在完成算法课的作业 ,没什么营养,大家轻喷…