There are a total of n courses you have to take, labeled from 0 ton - 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 abouthow a graph is represented.
这道题主要是判断有向图是否有环,用的是DFS的思想 这个题目用DFS比较合适,因为DFS一条龙深入下去,如果碰到之前访问过的,就是有环
class Solution {
public:
bool dfsVisit(vector<vector<int>*>& auxArray, int i, vector<int>& visit) {
visit[i] = 1;
if (auxArray[i] != NULL) {
for (int j=0; j<auxArray[i]->size(); j++) {
if (visit[auxArray[i]->at(j)] == 1) {
return false;
}
if (dfsVisit(auxArray, auxArray[i]->at(j), visit) == false) {
return false;
}
}
}
visit[i] = 2;
return true;
}
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
if ((numCourses > 0) && (prerequisites.size() == 0))
return true;
vector<vector<int>* > auxArray(numCourses, NULL);
for (int i=0; i<prerequisites.size(); i++) {
if (auxArray[prerequisites[i].first] == NULL) {
auxArray[prerequisites[i].first] = new vector<int>;
}
auxArray[prerequisites[i].first]->push_back(prerequisites[i].second);
}
vector<int> visit(numCourses, 0);
bool ret = true;
for (int i=0; i<auxArray.size(); i++) {
if (dfsVisit(auxArray, i, visit) == false) {
ret = false;
break;
}
}
for (int i=0; i<auxArray.size(); i++) {
if (auxArray[i] != NULL)
delete auxArray[i];
}
return ret;
}
};

本文探讨了如何使用深度优先搜索(DFS)算法解决课程依赖问题,通过构建有向图来判断是否能完成所有课程的学习。
1072

被折叠的 条评论
为什么被折叠?



