Course Schedule II

原题链接
在这里插入图片描述
这道题就是典型的拓扑排序问题。简单说一下拓扑排序:对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。

拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。
(1) 选择一个入度为0的顶点并输出之;
(2) 从网中删除此顶点及所有出边。

循环结束后,若输出的顶点数小于网中的顶点数,则说明存在回路,

回到这道题中,首先需要遍历一次pre中所有的有向边,统计每一个点的入度,为此我使用了map;并且记录每一个起始点的邻接点。
先将入度为0的节点进栈,然后进行广度优先遍历,将栈顶的元素保存到栈res中,并依次将栈顶的邻接点的入度减1,如果邻接点的入度为0,那就将邻接点压入栈中,直到栈空。

最后判断res的长度是否等于n,如果相等,那就说明有向图中不存在回路,否则存在。

代码如下:

class Solution {
public:
    vector<int> findOrder(int n, vector<vector<int>>& pre) {
        vector<int> res,tmpres;
       vector<int> degree;
        
        vector<set<int>> neighbor(n,set<int>());
        for(auto item:pre){
            degree[item[0]]++;
           
            neighbor[item[1]].insert(item[0]);
        }
        
        for(int i=0;i<n;i++){
            if(degree[i]==0){
                tmpres.push_back(i);
            }
        }
       
        while(tmpres.size()){
            int t = tmpres.back();tmpres.pop_back();
            
            res.push_back(t);
            for(auto child:neighbor[t]){
                degree[child]--;
                if(degree[child]==0)tmpres.push_back(child);
            }
        }
        return res.size()==n?res:vector<int>();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,ClassNotFoundException是一种异常类型,表示在运行时找不到指定的类。当使用Class.forName()方法或ClassLoader.loadClass()方法加载类时,如果找不到指定的类,就会抛出ClassNotFoundException异常。 对于你提到的ClassNotFoundException: CourseSchedule异常,它表示在运行时无法找到名为CourseSchedule的类。这可能是由于以下几个原因导致的: 1. 类名拼写错误:请确保你输入的类名正确无误。Java对类名是区分大小写的,所以请检查类名的大小写是否与实际类名一致。 2. 缺少依赖:如果CourseSchedule类依赖于其他类或库,而这些依赖项没有正确地被包含在项目中,就会导致ClassNotFoundException异常。请确保所有依赖项都已正确添加到项目中。 3. 类路径问题:如果CourseSchedule类所在的包或目录没有被正确地包含在类路径中,也会导致ClassNotFoundException异常。请检查类路径设置,确保包含了CourseSchedule类所在的路径。 解决这个问题的方法取决于你的具体情况。如果是第一种情况,你可以检查类名的拼写是否正确。如果是第二种情况,你需要确保所有依赖项都已正确添加到项目中。如果是第三种情况,你需要检查类路径设置是否正确。 如果你能提供更多的上下文信息,比如你是在什么情况下遇到这个异常,以及你的代码或项目结构,我可以给出更具体的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值