您的位置:首页 > 其它

Course Schedule

2015-06-09 09:40 651 查看
There are a total of n courses you have to take, labeled from
0
to
n
- 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.

找是否存在环,用深搜。不难,但因为数组越界debug了好久。吸取到一个教训,为方便debug以后在可能存在越界的地方加上断言。

class Solution {
public:
int *visit;
bool isCircle;
void isExistCircle(vector<vector<int> > &a,int i)
{
if(visit[i] == 1 || isCircle) return;
visit[i] = -1;
for(int j = 0;j<a[i].size();++j)
{
if(visit[a[i][j]] == -1){ isCircle = true; return; }
isExistCircle(a,a[i][j]);
}
visit[i] = 1;
}

bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {

if(numCourses == 0) return true;

vector<vector<int> > a(numCourses,vector<int>());
visit = new int[numCourses];
memset(visit,0,numCourses*sizeof(int));
isCircle = false;

for(int i=0;i<prerequisites.size();++i)
{
a[prerequisites[i].first].push_back(prerequisites[i].second);
}

for(int i=0;i<numCourses;++i) isExistCircle(a,i);

delete []visit;
return !isCircle;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: