[LeetCode] 207. Course Schedule
2016-09-26 16:20
477 查看
思路:
Topological sort, 拓扑分类. 这道题思考了好几天, 看了参考, 但是想把两种方法都搞清楚, 花了些时间.
两个思路: DFS和BFS.
两个思路都要做的事情是先把图给建好, 既然想上所有课, 那么就要从所有没有prerequisite的课开始作为起点, 向后一根一根的连接下一步可以上的课的节点.
然后DFS, DFS要做的就是从每个不需要prerequisite的起点开始, 一直向后找每一条可能的路径, 如果找到了循环, 那么这条路径就不可行, 退回去, 如果某条路径找到了头, 那么我们就可能上完所有课.
BFS要做的是维护一个维度表, 没有prerequisite的课的维度是0, 向后的课每层递增加1, 我们遍历每层图, 看图的层数有没有numCourses个, 并且能不能从每层都调出一个能上的课来, 如果都能做到, 说明这些课的要求也都合法, 返回true即可.
Topological sort, 拓扑分类. 这道题思考了好几天, 看了参考, 但是想把两种方法都搞清楚, 花了些时间.
两个思路: DFS和BFS.
两个思路都要做的事情是先把图给建好, 既然想上所有课, 那么就要从所有没有prerequisite的课开始作为起点, 向后一根一根的连接下一步可以上的课的节点.
然后DFS, DFS要做的就是从每个不需要prerequisite的起点开始, 一直向后找每一条可能的路径, 如果找到了循环, 那么这条路径就不可行, 退回去, 如果某条路径找到了头, 那么我们就可能上完所有课.
BFS要做的是维护一个维度表, 没有prerequisite的课的维度是0, 向后的课每层递增加1, 我们遍历每层图, 看图的层数有没有numCourses个, 并且能不能从每层都调出一个能上的课来, 如果都能做到, 说明这些课的要求也都合法, 返回true即可.
void makeGraph(vector<unordered_set<int>>& graph, vector<pair<int, int>>& prerequisites) { for (auto p : prerequisites) graph[p.second].insert(p.first); } bool dfs(vector<unordered_set<int>>& graph, int neighbor, vector<bool>& visited, vector<bool>& onPath) { if (visited[neighbor]) return false; visited[neighbor] = onPath[neighbor] = true; for (int n : graph[neighbor]) if (onPath || dfs(graph, n, visited, onPath)) return true; onPath[neighbor] = false; return false; } bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<unordered_set<int>> graph(numCourses); makeGraph(graph, prerequisites); vector<bool> visited(numCourses, false), onPath(numCourses, false); for (int i = 0; i < numCourses; i++) { if (visited[i]) continue; if (dfs(graph, i, visited, onPath)) return false; } return true; }
void makeGraph(vector<unordered_set<int>>& graph, vector<pair<int, int>>& prerequisites) { for (auto p : prerequisites) graph[p.second].insert(p.first); } void getDegrees(vector<int>& degrees, vector<unordered_set<int>>& graph) { for (auto node : graph) for (int n : node) degrees ++; } bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<unordered_set<int>> graph(numCourses); makeGraph(graph, prerequisites); vector<int> degrees(numCourses, 0); getDegrees(degrees, graph); int count = 0; queue<int> q; for (int i = 0; i < numCourses; i++) if (! degrees[i]) q.push(i); while (! q.empty()) { int cur = q.front(); count++; q.pop(); for (int n : graph[cur]) { if (! --degrees ) q.push(n); } } return count == numCourses; }
相关文章推荐
- Leetcode 207. Course Schedule & 210. Course Schedule II
- LeetCode 207. Course Schedule
- LeetCode 207. Course Schedule(拓扑排序)
- LeetCode207. Course Schedule
- leetcode 207. Course Schedule 课程调度 + 拓扑排序
- leetcode 207. Course Schedule
- [leetcode] 207. Course Schedule
- 第十二周 leetcode 207. Course Schedule(Medium)
- Leetcode 207. Course Schedule
- 【LeetCode】207. Course Schedule (2 solutions)
- 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