LeetCode -- 207. 课程表 (拓扑排序)

发布时间 2023-09-09 10:17:45作者: 深渊之巅

 经典拓扑排序的应用,用拓扑排序的算法看看原图中是否有一个合法的拓扑序。

class Solution {
public:
    const static int N = 2010, M = 5010;
    int h[N], e[M], ne[M], idx;
    int d[N], q[N];

    void add(int a, int b) {
        e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
    }

    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        memset(h, -1, sizeof h);

        for(auto &it : prerequisites) {
            add(it[1], it[0]);
            d[it[0]] ++ ;
        }

        auto f = [&]() {
            int hh = 0, tt = -1;
            for(int i = 0; i < numCourses; i ++ ) {
                if(!d[i]) q[ ++ tt] = i;
            }

            while(hh <= tt) {
                int t = q[hh ++ ];
                for(int i = h[t]; ~i; i = ne[i]) {
                    int j = e[i];
                    if( -- d[j] == 0) q[ ++ tt] = j;
                }
            }

            return tt == numCourses - 1;
        };

        return f();

    }
};