题目:课程表(深度优先遍历)

该博客介绍了如何使用C++的深度优先遍历(DFS)解决东华OJ第71题课程表的问题。代码中定义了一个Solution类,包含邻接表、节点状态和环检查等关键元素。在DFS函数中,遍历每个节点及其邻居以检测有无环路,最终返回是否存在环路的判断结果。

@课程表

东华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
@链接

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值