leetcode Course Schedule II
2015-12-04 22:30
531 查看
原题链接:https://leetcode.com/problems/course-schedule-ii/
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, return the ordering of courses you should take to finish all courses.
There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.
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 the correct course order is [0,1]
4, [[1,0],[2,0],[3,1],[3,2]]
There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is[0,2,1,3].
拓扑排序,输出结果
Ps:我喜欢用链式前向星建图。。
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, return the ordering of courses you should take to finish all courses.
There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.
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 the correct course order is [0,1]
4, [[1,0],[2,0],[3,1],[3,2]]
There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is[0,2,1,3].
拓扑排序,输出结果
Ps:我喜欢用链式前向星建图。。
class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { ans.clear(); int m = prerequisites.size(); inq = new int[numCourses + 10]; memset(inq, 0, sizeof(int)* (numCourses + 10)); head = new int[numCourses + 10]; memset(head, -1, sizeof(int)* (numCourses + 10)); G = new edge[m + 10]; for (int i = 0; i < m; i++) { int u = prerequisites[i].first, v = prerequisites[i].second; inq[u]++; add_edge(v, u); } queue<int> q; for (int i = 0; i < numCourses; i++) { if (!inq[i]) q.push(i); } while (!q.empty()) { int u = q.front(); q.pop(); ans.push_back(u); for (int i = head[u]; ~i; i = G[i].next) { if (--inq[G[i].to] == 0) q.push(G[i].to); } } delete[]G; delete[]inq, delete[]head; return ans.size() == numCourses ? ans : vector<int>(); } private: vector<int> ans; int tot, *inq, *head; struct edge { int to, next; }*G; inline void add_edge(int u, int v) { G[tot].to = v, G[tot].next = head[u], head[u] = tot++; } };
相关文章推荐
- [置顶] python语言处理get类型请求,调试模式获取数据代码
- 获取文件创建时间时获取不到的解决方法
- LVS Nginx HAProxy 优缺点
- web app 入门教程第一章基础知识
- 数据结构.平衡二叉树.从二叉排序树到平衡二叉树
- eclipse没有New Java Class的解决办法
- 大型web系统数据缓存设计
- Redis: Jedis 源代码剖析2- 发布者/订阅者模式剖析
- NYOJ 3 多边形重心问题 (求多面性重心及面积)
- Android性能优化
- HTML5----移动开发兵器谱(笔记篇)
- 异步加载图片,实现图文混排
- JavaScript-undefined与null区别
- HDOJ 1115 Lifting the Stone (求多边形重心坐标)
- 症状:可以上网,可以上QQ,不能登陆360安全卫士,360浏览器无法同步,有道词典等无法登陆,无法查询。
- 五种马斯洛需求理论演变
- C++11的enum class & enum struct和enum
- 大数据下多流形聚类分析之谱聚类SC
- [置顶] Python语言处理整个文件的base64编码解码源码共享
- ubuntu中的大小写