hot100:课程表

拓扑排序用于验证一个图里是否有环

#include <vector>
#include <queue>

using namespace std;

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> graph(numCourses);
        vector<int> inDegree(numCourses, 0);

        for (auto prerequisite : prerequisites) {
            int a = prerequisite[0];
            int b = prerequisite[1];
            graph[b].push_back(a); // b -> a
            inDegree[a]++;
        }

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

        int count = 0; // 记录已经排序的课程数量
        while (!q.empty()) {
            int course = q.front();
            q.pop();
            count++;

            for (int neighbor : graph[course]) {
                inDegree[neighbor]--;
                if (inDegree[neighbor] == 0) {
                    q.push(neighbor);
                }
            }
        }

        // 如果所有课程都被排序,说明没有环
        return count == numCourses;
    }
};
posted @ 2025-02-16 11:49  huigugu  阅读(3)  评论(0编辑  收藏  举报