AC截图

题目


思路
这道题可以抽象为一个有向无环图,判断是否可以进行拓扑排序
①构建邻接表
vector<vector<int>> edge:下标代表节点编号,数组内容代表该结点的直接后置结点
vector<int> indegree:下标代表结点编号,数组内容代表该结点入度。在入度为0的时候,可以加入拓扑排序序列。
②将所有入度为0的结点加入队列
③进行bfs遍历
代码
cpp
class Solution {
public:
vector<vector<int>> edge;
vector<int> indegree;
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
edge.resize(numCourses);
indegree.resize(numCourses);
for(auto pre:prerequisites){
edge[pre[1]].push_back(pre[0]);
indegree[pre[0]]++;
}
queue<int> q;
for(int i=0;i<numCourses;i++){
if(indegree[i]==0){
q.push(i);
}
}
int visit=0;
while(!q.empty()){
visit++;
int u = q.front();
q.pop();
for(int v:edge[u]){
indegree[v]--;
if(indegree[v]==0){
q.push(v);
}
}
}
return visit==numCourses;
}
};