先修课的安排问题,要判断能不能修完所给的课程,只要看图中有没有环。思路参考上一篇图的文章。AC代码如下。
这是用递归判断每一个点开始做DFS是否有环,实际上性能稍差,因为有重复判断的情况,可以加一个数组存储递归的结果,免去重复递归的情况。
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int> >& prerequisites) {
vector<vector<int> > matrix(numCourses);
for(int i = 0; i < prerequisites.size(); i++)
matrix[prerequisites[i].second].push_back(prerequisites[i].first);
int visit[numCourses] = {0};
for(int i = 0; i < numCourses; i++)
if(isCircle(i, matrix, visit))return false;
return true;
}
bool isCircle(int v, vector<vector<int> >& matrix, int * visit)
{
if(visit[v])return true;
visit[v] = 1;
for(int i = 0; i < matrix[v].size(); i++){
if(isCircle(matrix[v][i], matrix, visit))return true;
}
visit[v] = 0;
return false;
}
};