LeetCode Course Schedule BFS
2015-10-24 18:02
295 查看
思路:
BFS + 拓扑排序
Status:MLE
Reason:用二维数组
看了DISCUSS后的优化:
用
Staus:AC
BFS + 拓扑排序
Status:MLE
Reason:用二维数组
vector<vector<int>>存图信息,有太多没用的信息0,占用了很大空间。
看了DISCUSS后的优化:
用
vector<unordered_set<int>>存图信息,表示为每个节点对应连接到哪些节点。
class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<int> inDegree(numCourses, 0); vector<vector<int>> graph(numCourses, vector<int>(numCourses, 0)); queue<int> q; for(int i = 0; i < numCourses; ++i) { if(inDegree[i] == 0) q.push(i); } while(!q.empty()) { int start_node_id = q.front(); q.pop(); for(int i = 0; i < numCourses; ++i) { if(graph[start_node_id][i] == 1) { inDegree[i]--; if(inDegree[i] == 0) { q.push(i); } } } } for(int i = 0; i < numCourses; ++i) { if(inDegree[i] != 0) { return false; } } return true; } };
Staus:AC
class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<unordered_set<int>> need(numCourses); for (size_t i = 0; i != prerequisites.size(); ++i) need[prerequisites[i].second].insert(prerequisites[i].first); vector<int> indegree(numCourses); for (int i = 0; i != numCourses; ++i) for(auto it = need[i].begin(); it != need[i].end(); ++it) ++indegree[*it]; queue<int> zeros; for (int i = 0; i != numCourses; ++i) if (indegree[i] == 0) zeros.push(i); while (!zeros.empty()) { int seq = zeros.front(); zeros.pop(); for (auto it = need[seq].begin(); it != need[seq].end(); ++it) if (--indegree[*it] == 0) zeros.push(*it); --numCourses; } return numCourses == 0; } };
相关文章推荐
- js写一个日期Ⅱ(完结)
- 关于MongoDB的几个重要的网站
- HDU 3062 Party 2-SAT
- elasticsearch中国字(mmseg)——手动添加字典
- jquery遍历
- 洛谷1462 通往奥格瑞玛的道路
- iOS 验证码 小技术之 UIButton NSTimer 计时器
- SpringMVC 1:非注解方式快速入门
- struts2-ajax-json应用实例
- phpstorm 9.0最新 注册码亲测可用注册码
- JWeb框架
- Scrum Meeting 10.25
- [笔记]OO真经——关于面向对象的哲学体系及科学体系的探讨
- 清华大学出版社:《互联网+时代下的协同OA管理》隆重推出
- FreeRTOS初步认识
- hdu2027
- 几个笔试题
- 统计1到100出现9的次数 1.0
- Mac上配置Hadoop 2.6
- MySQL的decimal类型