解题思路
求拓扑排序,从入度为0的点出发去遍历
vector<vector<int>> edges(numCourses);
记录每个顶点的关联顶点
vector<int> degree(numCourses);
记录每个顶点的入度
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> edges(numCourses);
vector<int> degree(numCourses);
for(const auto &x : prerequisites){
edges[x[1]].emplace_back(x[0]);//0 -> 1
degree[x[0]]++;//入度
}
queue<int> q;
for(int i = 0;i < numCourses;++i){//这里不能用新特性,插入会出现问题
if(degree[i] == 0)q.push(i);//从度为0的顶点出发
}
int visited = 0;
while(!q.empty()) {
visited++;
int cur = q.front();
q.pop();
for(auto x : edges[cur]){//在图中消去cur结点
degree[x]--;//x顶点的入度减一
if(degree[x] == 0)q.push(x);
}
}
return visited == numCourses;
}
};