您的位置:首页 > 其它

Course Schedule

2016-02-18 06:44 369 查看
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.

Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.

Analyse: Using BFS.

class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
if(prerequisites.empty()) return true;

int n = prerequisites.size();
vector<vector<bool> > graph(numCourses, vector<bool>(numCourses, false));
vector<int> indegree(numCourses, 0);
for(int i = 0; i < n; i++){
if(graph[prerequisites[i].second][prerequisites[i].first] == false){//avoid duplicate pairs
graph[prerequisites[i].second][prerequisites[i].first] = true;
indegree[prerequisites[i].first]++;
}
}
stack<int> stk;
int count = 0;
for(int i = 0; i < numCourses; i++){
if(indegree[i] == 0)
stk.push(i);
}
while(!stk.empty()){
int source = stk.top();
stk.pop();
count++;
for(int i = 0; i < numCourses; i++){
if(graph[source][i]){
indegree[i]--;
if(indegree[i] == 0)
stk.push(i);
}
}
}
return count == numCourses;
}
//1. construct a graph and compute each node's indegree
//2. push all nodes with 0 indegree to a stack
//3. pop out the first node, decrease its neighbour's degree by 1
//   push all nodes with 0 indegree to a stack and continue
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: