广度优先搜索
对于上面这样一张图,我们已知节点之间的连接关系,我们要判断图中是否存在环,并返回它的拓扑排序。首先,计算每一个节点的入度,以入度为0的节点作为初始点进行广度优先遍历,并将当前节点的邻节点入度-1。
class Solution {
private:
vector<vector<int>> edges;
vector<int> indeg; //用于存储节点的入度,每次作为邻节点遍历到时入度-1,为0时计入队列
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
indeg.resize(numCourses);
for (const auto& info: prerequisites) { //添加有向边信息以及节点的入度
edges[info[1]].push_back(info[0]);
++indeg[info[0]];
}
queue<int> q;
for (int i = 0; i < numCourses; ++i) { //将入度为0的节点加入队列
if (indeg[i] == 0) {
q.push(i);
}
}
int visited = 0;
while (!q.empty()) {
++visited;
int u = q.front();
q.pop();
for (int v: edges[u]) {
--indeg[v];
if (indeg[v] == 0) {
q.push(v);
}
}
}
return visited == numCourses;
}
};
深度优先遍历
以后再写