拓扑排序【学习算法】

简介: 拓扑排序【学习算法】

前言

2023-9-24 15:32:23

以下内容源自《【学习算法】》

仅供学习交流使用


推荐

拓扑排序

核心思想

就是先找到入度为0的结点

删除它发出的边

继续找入度为0的结点

直到找不到为止

判断剩下有没有结点

207. 课程表

207. 课程表

解法一

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int n=numCourses;
        HashMap<Integer,ArrayList<Integer>> map=new HashMap<>();
        for (int i = 0; i < n; i++) {
            map.putIfAbsent(i,new ArrayList<>());
        }
        for(int[] course:prerequisites){
            map.get(course[0]).add(course[1]);
        }
        return topo(map,n);
    }
    public boolean topo(HashMap<Integer,ArrayList<Integer>> map,int n){
        int count=0;
        Stack<Integer> stack=new Stack<>();
        for (int i = 0; i < n; i++) {
            //找到入度为0的点
            if (map.get(i).size()==0){
                stack.add(i);
            }
        }
        while (!stack.isEmpty()) {
            Integer i=stack.pop();
            for (int j = 0; j < map.size(); j++) {
                if (map.get(j).contains(i)){
                    map.get(j).remove(i);
                    if (map.get(j).size()==0){
                        stack.add(j);
                    }
                }
            }
            count++;
        }
        return count == n;
    }    
}

解法二

一个入度矩阵 indeg

一个访问变量 visited

class Solution {
    List<List<Integer>> edges;//有向图
    int [] indeg;//入度
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        edges=new ArrayList<List<Integer>>();
        for(int i=0;i<numCourses;i++){
            edges.add(new ArrayList<Integer>());
        }
        indeg=new int[numCourses];
        for(int[] info:prerequisites){
            edges.get(info[1]).add(info[0]);
            indeg[info[0]]++;
        }
        //拓扑排序
        Queue<Integer> queue = new LinkedList<Integer>();
        for(int i=0;i<numCourses;i++){
            if(indeg[i]==0){
                queue.offer(i);
            }
        }
        //广度优先搜索
        int visited=0;
        while(!queue.isEmpty()){
            visited++;
            int u=queue.poll();
            for(int v:edges.get(u)){
                indeg[v]--;
                if(indeg[v]==0){
                    queue.offer(v);
                }
            }
        }
        return visited==numCourses;
    }
}

最后

2023-9-24 15:45:02

我们都有光明的未来

祝大家考研上岸

祝大家工作顺利

祝大家得偿所愿

祝大家如愿以偿

点赞收藏关注哦

相关文章
|
23天前
|
人工智能 算法 测试技术
【数学】【排序】【C++算法】3027人员站位的方案数
【数学】【排序】【C++算法】3027人员站位的方案数
|
21天前
|
人工智能 算法 BI
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
20 0
|
21天前
|
算法
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
22 1
|
2天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
2天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
2天前
|
算法
讲课:拓扑排序、最短路算法
讲课:拓扑排序、最短路算法
|
6天前
|
算法 索引
数据结构与算法-排序进阶入门
数据结构与算法-排序进阶入门
7 0
|
15天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
16天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
21 0
|
17天前
|
算法 安全 数据可视化
python关联规则学习:FP-Growth算法对药品进行“菜篮子”分析
python关联规则学习:FP-Growth算法对药品进行“菜篮子”分析
16 0