@课程表
东华oj 第71题 课程表 C++ 深度优先遍历
没错 看懂之后抄的!我也不知道咋学
代码片.
class Solution {
private:
//edges 邻接表
vector<vector<int>> edges;
//三个状态,0 未遍历,1正在遍历,2已经遍历
vector<int> visited;
//遍历过程中 没有出现环
bool valid = true;
public:
void dfs(int u) {
//开始遍历这个节点,修改状态为"正在遍历"
visited[u] = 1;
//遍历这个节点指向的所有邻居节点
for (int v: edges[u]) {
//如果邻居节点“未遍历”,就深度优先遍历这个邻居节点
if (visited[v] == 0) {
dfs(v);
if (!valid) {
return;
}
}
//如果这个节点就是出于“正在遍历”状态 说明遇到了环 valid=false.结束了
else if (visited[v] == 1) {
valid = false;
return;
}
}
//这个节点的所有邻居遍历完了,标记这个节点为“已经遍历”。
visited[u] = 2;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
visited.resize(numCourses);
//初始化邻接表
for (const auto& info: prerequisites) {
edges[info[1]].push_back(info[0]);
}
//遍历所有节点 如果这个点没有进行遍历过 就对这个点开始进行深度优先搜索
for (int i = 0; i < numCourses && valid; ++i) {
if (!visited[i]) {
dfs(i);
}
}
return valid;
}
};
作者:LeetCode-Solution
@链接
该博客介绍了如何使用C++的深度优先遍历(DFS)解决东华OJ第71题课程表的问题。代码中定义了一个Solution类,包含邻接表、节点状态和环检查等关键元素。在DFS函数中,遍历每个节点及其邻居以检测有无环路,最终返回是否存在环路的判断结果。
645

被折叠的 条评论
为什么被折叠?



