LeetCode 207. Course Schedule

本文深入探讨了LeetCode上的课程安排问题,通过分析有向图是否存在环来判断能否完成所有课程。利用BFS算法,记录入度为零的课程,逐步减少依赖课程的入度,最终确定所有课程是否可完成。

题目描述

出处 https://leetcode.com/problems/course-schedule/description/

There are a total of n courses you have to take, labeled from 0 to n-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

Example 1:

Input: 2, [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take. To take course 1 you shouldhave finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a totalof 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.


分析

这道题的目的是求有向图中是否又环,可以通过bfs的方法。记录可以完成的课程,若课程入度为零,则表示该课程可以进行。从入度为零的点开始,将该节点的子节点入度减一,记录所有入度为零节点数量,若图中不存在环,则入度为零节点数等于节点总数。


最终结果

class Solution {
public:    
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<vector<int>> list(numCourses);      
        vector<int> degree(numCourses, 0);
        queue<int> que;
        
        for (auto p: prerequisites) {
            list[p.second].push_back(p.first);      
            degree[p.first]++;
        }

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

        int finish = 0;
        while(!que.empty()){
            int num = que.front();
            finish ++;
            que.pop();
            for(auto& p:list[num]) {
                degree[p] --;
                if (degree[p] == 0)     
                    que.push(p);
            }
        }
        
        return finish == numCourses;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙BOOK言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值