拓扑排序的经典应用。
将课程看作图中的节点,先修关系看作边,由先修课指向后修课,则问题抽象为一个图的节点的拓扑排序问题。
我的这篇博客中介绍了对于无环图如何进行拓扑排序。
代码
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& pres) {
if(numCourses <= 1)
return true;
vector<int> indegree(numCourses,0);
for(int i = 0;i < pres.size(); i++)
indegree[pres[i].second]++;
int count = 0;
while(1)
{
bool addone = false;
for(int i = 0;i < numCourses; i++)
{
if(indegree[i] == 0)
{
indegree[i]--;
count++;
addone = true;
for(int j = 0;j < pres.size(); j++)
{
if(pres[j].first == i)
indegree[pres[j].second]--;
}
}
}
if(!addone)
return false;
if(count == numCourses)
break;
}
return true;
}
};