207. Course Schedule【Medium】 DFS判断无环
来源:互联网 发布:java web开发需求 编辑:程序博客网 时间:2024/06/04 19:42
一开始做这题的时候想用邻接矩阵来储存edge,后来发现bool类型是不能开2000*2000以上的二维数组的(上网查了查好像是因为栈的空间被编译器限制住了大小所以不能开这么大的二维数组),导致浪费了很多时间debug。后来用了邻接链表才解决了问题。
思路就是课堂上讲的:要判断这个课程安排是否会冲突,就是看这个图是否存在回路(环路)。
而存在环路的充要条件是DFS这个图后这个图不存在back edge——edge (u->v),pre(v)<pre(u)<post(u)<post(v)。
所以就按照书上的方法来实现就完成了,难度一般。
class Solution {public:typedef struct node {int v;node* next;node(int vv, node* nn = 0) {v = vv;next = nn;} } node;node* map[4001] = {0};node* tail[4001] = {0}; int visited[4001][2] = {{0}}; int clock; int n; void explore(int start) { visited[start][0] = ++clock; for (int i = 0; i < n; ++i) { if (start == i) continue; if (if_path(start, i) && visited[i][0] == 0) explore(i); } visited[start][1] = ++clock; } bool if_path(int x, int y) { node* temp = map[x]; while (temp) { if (y == temp->v) return true; temp = temp->next;}return false;} bool canFinish(int numCourses, std::vector<pair<int, int> >& prerequisites) { // initialize and build map n = numCourses; clock = 0; int fir, sec; for (int i = 0; i < prerequisites.size(); ++i) { fir = prerequisites[i].first; sec = prerequisites[i].second; node* temp = new node(sec, 0); if (tail[fir]) tail[fir]->next = temp; else map[fir] = temp; tail[fir] = temp; } // dfs for (int i = 0; i < numCourses; ++i) { if (visited[i][0] == 0) explore(i); } // find if back edge exists for (int i = 0; i < numCourses; ++i) for (int j = 0; j < numCourses; ++j) if (if_path(i, j) && visited[i][0] > visited[j][0] && visited[i][1] < visited[j][1]) return false; return true; }};
阅读全文
0 0
- 207. Course Schedule【Medium】 DFS判断无环
- 207. Course Schedule Medium
- 【LeetCode】207. Course Schedule (Medium)
- LeetCode 207. Course Schedule [Medium]
- (M)DFS:207. Course Schedule
- DFS解207. Course Schedule(判断有向图是否存在环)
- 207. Course Schedule 难度:medium 类别:图
- 207. Course Schedule (Medium)&& 210. Course Schedule II(Medium)
- [Leetcode 207, Medium] Course Schedule
- LeetCode #207 - Course Schedule - Medium
- 210. Course Schedule II Medium
- 207. Course Schedule 图的dfs算法
- 拓扑排序-207. Course Schedule[medium]
- 第十二周 leetcode 207. Course Schedule(Medium)
- Leetcode解题笔记 207.Course Schedule [Medium] 拓扑排序
- [Leetcode 270, Medium] Course Schedule II
- 【LeetCode】210. Course Schedule II (Medium)
- LeetCode #210 - Course Schedule II - Medium
- 初次用myeclipse连接tomcat心得
- Java数据结构详解(二)-List接口
- FreeMarker 与 Struts2 的结合
- Tomcat
- Java练习
- 207. Course Schedule【Medium】 DFS判断无环
- Android 5.X 新特性详解(一)MD主题、Palette、视图阴影、Tinting(着色)和Clipping(裁剪)
- 模式匹配、KMP算法
- java关键字(一)——byte,int,long,short
- java基础—常用类
- 暑假总结
- 面向切面编程(AOP)
- NYOJ
- 联发科编程大赛_第六题小M的篮球梦