LeetCode OJ 207. Course Schedule
来源:互联网 发布:华为程序员招聘要求 编辑:程序博客网 时间:2024/05/17 02:15
LeetCode OJ 207. Course Schedule
典型的拓扑排序算法。谨以此题纪念期末机考时没AC这么简单的拓扑排序。upset……ing
Description
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.
Note:
- The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
- You may assume that there are no duplicate edges in the input prerequisites.
解题思路
拓扑排序:
- 统计所有的定点的入度
- 入度为0的定点入队
- 队列定点出队时,将这个定点的所有邻接顶点入度减一,且如果入度为0时,马上入队。
- 循环第三步,直至队列为空。
拓扑排序也可以用于判断有向图是否有环
代码
个人github代码链接
class Solution {public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<unordered_set<int> > adj(numCourses); vector<int> indegree(numCourses, 0); //存储有向图,并且计算每个点的入度 for(int i = 0; i < prerequisites.size(); i++) { adj[prerequisites[i].first].insert(prerequisites[i].second); indegree[prerequisites[i].second]++; } //入度为0的定点入队 queue<int> q; for(int i = 0; i < numCourses; i++){ if(indegree[i] == 0) q.push(i); } int count = 0; while(!q.empty()){ int v = q.front(); q.pop(); //输出当前入度为0的定点,并且输出计数加1 cout << v << endl; count ++; //所有定点v的邻接定点入度减一,并且将入度为0的定点入队 for(unordered_set<int>::iterator itr = adj[v].begin(); itr != adj[v].end(); itr++){ indegree[*itr]--; if(indegree[*itr] == 0) q.push(*itr); } } //输出的定点数少于全部定点数,则表示图中有回路。所以拓扑排序可以用来判断有向图有无回路 if(count < numCourses) return false; else return true; }};
- LeetCode OJ 207. Course Schedule
- [leetcode] 207.Course Schedule
- Leetcode 207. Course Schedule
- 207. Course Schedule LeetCode
- leetcode 207. Course Schedule
- leetcode.207. Course Schedule
- LeetCode 207. Course Schedule
- 【LeetCode】207. Course Schedule
- [leetcode] 207. Course Schedule
- leetcode-207. Course Schedule
- leetcode 207. Course Schedule
- [LeetCode] 207. Course Schedule
- 【Leetcode】207. Course Schedule
- Leetcode 207. Course Schedule
- LeetCode 207.Course Schedule
- Leetcode 207. Course Schedule
- Leetcode 207. Course Schedule
- [LeetCode]207. Course Schedule
- web安全-提前说明
- 博主自传
- 【蓝桥杯单片机组】超声波模块
- 父类引用指向子类对象
- Spring Security 4.x 启用BCrypt加密
- LeetCode OJ 207. Course Schedule
- 20 课程总结,单机模式下的文件上传与下载
- Git基本知识
- 如何设置虚拟机才能上网?
- PAT 1018. Public Bike Management
- 网页全截图实现
- opencv基本数据类型
- git分支
- Spring四种依赖注入方式