Leetcode 207 课程表(复习拓扑排序)

题目描述:

  你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]

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

题解:

  拓扑排序模板题目,简单复习了一下。看了一下之前用的模板,好丑...换个模板

AC代码:

  

class Solution {
public:
    // 复习一下拓扑排序
    bool Topo(int n)
    {
        queue<int> que; // 入度为0的点
        for(int i=0;i<n;i++)
        {
            if(degree[i] == 0) que.push(i);
        }
        int count = 0;
        while(!que.empty())
        {
            int now = que.front();
            que.pop();
            count++;
            int edge_len = edge[now].size();
            for(int i=0;i<edge_len;i++)
            {
                degree[edge[now][i]]--;
                if(degree[edge[now][i]] == 0) que.push(edge[now][i]);
            }
        }
       // cout << count <<endl;
        if(count != n) return false;
        return true;
    }
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        int Len = prerequisites.size();
        for(int i=0;i<=numCourses;i++) 
        {
            edge[i].clear();
            degree[i] = 0;
        }
        
        for(int i=0;i<Len;i++)
        {
            int fir = prerequisites[i][0];
            int sec = prerequisites[i][1];
            degree[sec]++;
            edge[fir].push_back(sec);
        }

        return Topo(numCourses);
    }
private:
    vector<int> edge[100010];
    int degree[100010];
};

猜你喜欢

转载自www.cnblogs.com/z1141000271/p/12610885.html