力扣210. 课程表 II

深度优先遍历

  • 思路:
    • 搜索逻辑参见​​​​​​力扣207.课程表
    • 需要课程安排的顺序,课程搜索完成时,将其存储起来即可;
    • 存储课程的顺序需要注意:
      • 输入依赖中 [A, B]
      • 图中表示 B -> A ,表示先 B 后 A;
      • 可能有其他课程也会依赖 A,比如 [C, A],有向图表示 A -> C;
      • 先标记染色的是叶子节点 C,而先需要安排的课程是 B;
      • 所以存储顺序需要反向;(所以 207 课程表中的思路逻辑描述有误)
class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        digraph.resize(numCourses);
        visited.resize(numCourses);

        for (const auto & info : prerequisites) {
            digraph[info[1]].push_back(info[0]);
        }

        for (int i = 0; i < numCourses && valid; ++i) {
            if (visited[i] == 0) {
                dfs(i);
            }
        }

        if (!valid) {
            return {};
        }

        std::reverse(result.begin(), result.end());

        return result;
    }

private:
    void dfs(int u) {
        // to search state
        visited[u] = 1;

        for (int v : digraph[u]) {
            // init state
            if (visited[v] == 0) {
                dfs(v);
                if (!valid) {
                    return;
                }
            } else if (visited[v] == 1) {
                // ring
                valid = false;
                return;
            }
        }

        visited[u] = 2;

        result.push_back(u);
    }


private:
    std::vector<std::vector<int>> digraph;
    std::vector<int> visited;
    std::vector<int> result;

    bool valid = true;
};

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值