LeetCode 207 课程表

  • 分析

    通过 拓扑排序 判断此课程安排图是否是 有向无环图(DAG) 。   

    建立一个indegree数组,indegree[i]表示第i-1个节点的入度,同时建立一个邻接表表示图。申请一个队列进行广搜,把indegree中为0的节点入队,每入队一个num加1(num表示已经入过队的个数)。当对不空时,执行下面循环:

    出队一个元素,将邻接表中它所指向的后序元素的入度减1,当后序元素的入度是0,将元素入队,num+1。当队空时,如果num==numCourses,则没有环。因为只有没有环才能保证每个元素入队一次。

  • 代码
class Solution {
public:
    bool canFinish(int numCourses, vector>& prerequisites) {
        vector indegree(numCourses, 0); //入度     
        vector> adjent(numCourses);//邻接表
        int size = prerequisites.size();
        for(int i = 0; i < size; i++){
            indegree[prerequisites[i][0]]++;
            adjent[prerequisites[i][1]].push_back(prerequisites[i][0]);
        }

        queue que;
        int num = 0;

        for(int i = 0; i < numCourses; i++){
            if(indegree[i] == 0){
                ++num;
                que.push(i);
            }
        }
        //BFS搜索
        while(!que.empty()){
            int temp = que.front();
            que.pop();
            int i = adjent[temp].size() - 1;
            while(i >= 0){
                if((--indegree[adjent[temp][i]]) == 0){
                    que.push(adjent[temp][i]);
                    ++num;
                }
                --i;
            }
        }

        if(num == numCourses){
            return true;
        }else{
            return false;
        }
    }
};

 

你可能感兴趣的:(#,LeetCode每日一题)