[leetcode] 207.Course Schedule

题目:
There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
题意:
有n门课程,编号是0到n-1。有些课程需要依赖其他先修课程修完才能再去修读,比如对于一个pair[0,1]代表就是要修读课程1必须先修读课程0。
判断n门课程能否都修读完,比如[0,1],[1,0],意思1号课程需要依赖0号课程,并且0号课程需要依赖1号。
思路:
这是一道关于拓扑排序的问题,我们可以使用深度优先或者广度优先遍历方法。先将不需要先修课程的课程号装入,然后将其出队列,并且将所有依赖这门课的课程的依赖数减去1,如果减之后变成了0,那么将这门课程加入队列。因为此时代表该课程的先修科目已经全部修完。
以上。
代码如下:

class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) 
    {
       int size = prerequisites.size();
       if(size == 0)return true;
       vector<int> degree(numCourses, 0);
       unordered_multimap<int,int> preMap;
       for(auto ele:prerequisites)
       {
           degree[ele.second]++;
           preMap.insert(ele);
       }
       int count = 0;
       queue<int> que;
       for(int i = 0; i < numCourses; i++)
       {
           if(degree[i] == 0)
                que.push(i);
       }
       while(!que.empty())
       {
           count++;
            int pre = que.front();
            que.pop();
            auto res = preMap.equal_range(pre);
            for(auto beg = res.first; beg != res.second; beg++)
            {
                degree[beg->second]--;
                if(degree[beg->second] == 0)
                    que.push(beg->second);
            }
       }
       if(count!= numCourses)return false;
       else return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值