207.课程表

207.课程表

题目:https://leetcode.cn/problems/course-schedule

思路

看这个视频了解广度优先搜索的方法:课程表 LeetCode

总结一下,总共需要两个数据结构,edges[u]={v1, v2, v3},由 u 指向 v,还有个 indge 数组表示节点的入度数量。然后大体有三个流程,初始化,队列入队,处理队列。背吧~

循环逻辑为:visited++(我又访问到一个节点),拿到这个节点 u,把这个 u 指向的所有 v 都减一,如果发现谁入库为 0 了,再加到队列中。

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> edges(numCourses);
        vector<int> indeg(numCourses);

        for (auto& p : prerequisites) {
            edges[p[1]].push_back(p[0]); // edges[u] = {v};
            indeg[p[0]]++; // v 的入度++
        }

        queue<int> q;
        for (int i = 0; i < numCourses; i++) {
            if (indeg[i] == 0) {
                q.push(i);
            }
        }

        int visited = 0;
        while (!q.empty()) {
            visited++;
            auto u = q.front();
            q.pop();

            for (int v : edges[u]) {
                indeg[v]--;
                if (indeg[v] == 0) {
                    q.push(v);
                }
            }
        }

        return visited == numCourses;
    }
};