首页 > 其他分享 >课程问题

课程问题

时间:2023-07-29 23:56:54浏览次数:31  
标签:vector int numCourses 问题 课程 节点 indeg

一. 课程表I

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

//判断是否存在拓扑排序
class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> edges[numCourses];//重构图(邻接表)
        vector<int> indeg(numCourses);//记录顶点入度t
        for (const auto& info: prerequisites) {
            edges[info[1]].push_back(info[0]);//重构图(邻接表)
            ++indeg[info[0]];//构图时记录入度
        }

        stack<int> q;//栈和队列在这里没有区别,都是用来存储无前驱节点的容器
        for (int i = 0; i < numCourses; ++i) 
            if (indeg[i] == 0) q.push(i); //先存储所有初始化无前驱节点

        int visited = 0;//记录访问数,后面就不用判断入度表有没有清0
        while (!q.empty()) {//当队列不为空
            ++visited;//访问一次加一
            int u = q.top();q.pop();//无前驱节点出队列,该节点移除
            for (int v: edges[u]) {//遍历该节点后继
                --indeg[v];//出队列节点移除,其后继入度都减一
                if (indeg[v] == 0) q.push(v);//削减至无前驱则入队
            }
        }
        return visited == numCourses;//判断是否访问完所有节点
    }
};

二. 课程表II

求出任意一个拓扑排序

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> res;
        vector<int> edges[numCourses];//重构图(邻接表)
        vector<int> indeg(numCourses);//记录顶点入度t
        for (const auto& info: prerequisites) {
            edges[info[1]].push_back(info[0]);//重构图(邻接表)
            ++indeg[info[0]];//构图时记录入度
        }

        stack<int> q;//栈和队列在这里没有区别,都是用来存储无前驱节点的容器
        for (int i = 0; i < numCourses; ++i) 
            if (indeg[i] == 0) q.push(i); //先存储所有初始化无前驱节点

        int visited = 0;//记录访问数,后面就不用判断入度表有没有清0
        while (!q.empty()) {//当队列不为空
            int u = q.top();q.pop();//无前驱节点出队列,该节点移除
            res.push_back(u);
            for (int v: edges[u]) {//遍历该节点后继
                --indeg[v];//出队列节点移除,其后继入度都减一
                if (indeg[v] == 0) q.push(v);//削减至无前驱则入队
            }
        }
        if(res.size()==numCourses) return res;
        return {};
    }
};

三. 课程表III

课程有持续时间和截止时间,求最多能上几门课

四. 并行课程II

一学期最多上k门课,求最少要多少学期

五. 并行课程III

可以同时上多门课,求最少月份

标签:vector,int,numCourses,问题,课程,节点,indeg
From: https://www.cnblogs.com/929code/p/17590835.html

相关文章

  • 新数据问题
    vca的去噪算法对数据有影响,当时好像所有数据对。这里的1,2,3,4对应的是specturh中的顺序brown是1darkgreen是2vineyard是3peagreen是4(问题很大标签对不上啊,标签错误啊)还有个问题这3,4提不出来啊。应该是去噪问题啊。但是欧式角很大。 这个欧式角是最小的不理解。 ......
  • 【Java】使用fastjson进行序列化时出现空指针异常问题研究
    最近在使用fastjson的JSONObject.toJSONString()方法将bean对象转为字符串的时候报如下错误:com.alibaba.fastjson.JSONException:writejavaBeanerror,fastjsonversion1.2.58,classcom.sun.proxy.$Proxy395,fieldName:0 atcom.alibaba.fastjson.serializer.JavaBeanS......
  • ArchLinux安装KDE Plasma和NetworkManager后网络无法正常连接的问题
    前几天刚刷了系统,发现开机自动启动NetworkManager后,无法正常激活网络(也就是网卡开机默认DOWN),但手动dhcpcd后就可以正常使用网络,所以我最近一直在开机自启NetworkManager后手动sudodhcpcd,直到今天我发现ipv6有点小问题之后实在忍不了了,解决了一下这个问题具体怎么解决的呢,简单的......
  • keil5使用TM4C123芯片时遇到的问题
    问题1keil无法加载这个文件lmidk-agdi.dll在MDKv5.29以及较新版本的MDK中,已删除对StellarisICDI调试适配器的支持,这将导致此类调试器DLL错误。需要下载一个MDK附件来继续支持StellarisICDIhttps://documentation-service.arm.com/static/60509bd61da8f8344a2ca1bf?token=......
  • 解决QT QGraphicsView提升到QChartView报错的问题
    使用QT提供的QChartView来绘制图表,提升QGraphicsView控件继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错呢。[问题描述]使用QGraphicsView显示图表的时候,我们需要将它提升为QChartView.但提升后再此运行一般会发生编译报错,错误发生在......
  • 2023.7.28 并行课程III
    根据题目要求,可以分析出,需要按照拓扑序上完所有的课。每次上课都需要一定时间,可以同时上任意多门课,要求最少得时间。比如说示例1中的一个拓扑序是123,可以让12并行,因此只需要3+5=8个时间。可以先用拓扑排序,得出拓扑序,然后进行dp(满足拓扑序即可dp)。dp时,对每个节点,令其花费时间为......
  • VMware-NAT网络模式下-设置静态IP后无法连接Internet的问题
    VMware-NAT网络模式下-设置静态IP后无法连接Internet的问题 设置Centos的静态IP和DNS     参考资料1.VMware-NAT网络模式下-设置静态IP后无法连接Internet的问题......
  • gdb 反汇编disas源码排列问题
    问题在开发过程中,可能需要查看cpp文件生成的汇编代码来确认一些问题。由于单纯的汇编代码看起来并不太容易捋清楚内部逻辑,所以最好能够把源代码的位置列出来。在gdb的早期版本中,这个功能是通过disas命令的/m修饰符(选项)来实现的。如果使用过这个选项就会发现,这个功能显示的结果......
  • 解决微信小程序使用switchTab跳转后页面不刷新的问题
    wx.switchTab({url:‘../index/index’,success:function(e){varpage=getCurrentPages().pop();if(page==undefined||page==null)return;page.onLoad();}})switchTab成功跳转后调用success,此时可以拿到跳转后页面......
  • 【Druid】Druid连接池泄露问题排查: wait millis 60000, active 50, maxActive 50
    要排查Druid连接池泄漏问题,可以按照以下步骤进行:检查代码中的连接释放:确保在使用完连接后,及时调用connection.close()或相应的释放连接的方法。确保没有遗漏或误释放连接的情况。检查连接池配置:确认连接池的参数设置是否正确。包括最大连接数、最小空闲连接数、连接超时时间等。确......