Leetcode207:课程表

2020-05-24  本文已影响0人  VIELAMI

【题目描述】
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]

给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/course-schedule
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

image.png
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
    //Leetcode207:课程表
    queue<int> que;
    vector<int> indegree(numCourses,0);
    vector<vector<int>> adj(numCourses,vector<int>());

    //build adjacent list
    for (int i = 0; i < prerequisites.size(); i++) {
        int cur = prerequisites[i][1];
        int adjN = prerequisites[i][0];
        adj[cur].push_back(adjN);

        //build indegree list
        indegree[adjN]++;

    }

    //for (int i = 0; i < adj.size(); i++) {
    //    for (int j = 0; j < adj[i].size(); j++) {
    //        cout << "front: " << i << "  back: " << adj[i][j] << endl;
    //    }
    //}

    //for (int i = 0; i < indegree.size(); i++) {
    //    cout << indegree[i] << " ";
    //}
    //cout << endl;

    for (int i = 0; i < indegree.size(); i++) {
        if (indegree[i] == 0) {
            que.push(i);
        }
    }

    while (!que.empty()) {
        int cur = que.front();
        que.pop();
        //cout << "pop: " << cur << endl;
        numCourses--;
        indegree[cur] = -1;
        for (int i = 0; i < adj[cur].size(); i++) {
            indegree[adj[cur][i]]--;
            if (indegree[adj[cur][i]] == 0) {
                que.push(adj[cur][i]);
            }
        }
    }

    if (numCourses == 0) return true;
    else return false;
}
上一篇下一篇

猜你喜欢

热点阅读