题目:
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.
分析:
细节决定成败。。。
代码:
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int needed[numCourses]={};
int size=prerequisites.size();
stack<int> stk;
for(int i=0;i<size;++i)
needed[prerequisites[i].first]++;
for(int i=0;i<numCourses;++i)if(!needed[i])stk.push(i);
vector<pair<int,int>>::iterator it;
while(!stk.empty()&&!prerequisites.empty()){
int rec=stk.top();
stk.pop();
it=prerequisites.begin();
while(it!=prerequisites.end()){
if((*it).second==rec){
needed[(*it).first]--;
if(!needed[(*it).first])stk.push((*it).first);
it=prerequisites.erase(it);
}
else ++it;
}
}
return prerequisites.empty();
}
};