力扣210(拓扑排序)

210. 课程表 II - 力扣(LeetCode)

这是一道拓扑排序的模板题。简单来说,给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此,拓扑排序也是图论中判断有向无环图的方法。

用bfs的拓扑排序思路如下:1.找到入度为0的节点,加入结果集;2.将该节点从图中移除

需要注意三点:1.移除不是真的移除,只不过是把与这个节点相连的节点的入度减一;2.如果一个节点与两个或以上个节点相连,那么在移除了这个节点之后就会有多个选择,因此拓扑排序的结果不唯一;3.如果结果集的元素个数不等于图中节点个数,那么就必定有环。

class Solution 
{
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) 
    {
        int n=numCourses;
        vector<vector<int>>graph(n);//图
        vector<int>ans;//结果集
        vector<int>inDegree(n,0);//记录入度的数组
        for(auto&p:prerequisites)//构建图
        {
            graph[p[1]].push_back(p[0]);
            inDegree[p[0]]++;
        }
        queue<int>que;
        for(int i=0;i<n;i++)//将入度为0的节点加入队列
        {
            if(inDegree[i]==0)
            {
                que.push(i);
            }
        }
        while(!que.empty())
        {
            int fro=que.front();
            que.pop();

            ans.push_back(fro);//加入结果集
            for(int x:graph[fro])//处理节点fro指向的节点
            {
                inDegree[x]--;
                if(inDegree[x]==0)
                {
                    que.push(x);
                }
            }
        }

        if(ans.size()!=n)
        {
            return {};
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值