力扣207. 课程表
发布时间:2024年01月13日
深度优先搜索
- 思路:
- 课程看作节点,依赖关系看作是有向边,整体是一个有向图;
- 要学完所有课程,则需要有向图中不存在相互依赖,即不存在环;
- 依次遍历课程,如果课程状态依赖未解决,则深度搜索其依赖课程状态,直到没有依赖能够确定状态,再回溯上层被依赖课程,在搜索过程中的状态迁移:
- 初始状态 0;
- 开始搜索状态 1,表示开始处理该课程的状态;
- 确定状态 2,表示不依赖其他课程,或者依赖的课程已经确定不依赖其他课程;
- 在搜索的过程中,如果其对应的目标课程也进入搜索状态,表明存在相互依赖,形成环了;
- 使用一个变量标记是否有环,一旦有环则结束;
- 使用一个数组记录课程的搜索状态;
- 将课程的依赖关系调整成以依赖的课程为 key,目标课程为 value 的哈希表;
class Solution {
public:
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] == 0) {
dfs(i);
}
}
return valid;
}
private:
void dfs(int u) {
// to search
visited[u] = 1;
for (int v: edges[u]) {
// init state
if (visited[v] == 0) {
dfs(v);
if (!valid) {
return;
}
} else if (visited[v] == 1) {
// ring
valid = false;
return;
}
}
// searched
visited[u] = 2;
}
private:
std::vector<std::vector<int>> edges;
std::vector<int> visited;
bool valid = true;
};
文章来源:https://blog.csdn.net/N_BenBird/article/details/135575093
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!