Leetcode解题笔记 210.Course Schedule II [Medium] 拓扑排序

版权声明:自由转载-非商用-非衍生-保持署名 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;

    }
};

这类博客更多是在完成算法课的作业 ,没什么营养,大家轻喷…

猜你喜欢

转载自blog.csdn.net/mgsweet/article/details/79001293