拓扑排序问题

简介: 拓扑排序问题

公众号merlinsea


  • AOV网
  • 活动在顶点上的网(Activity on Vertex Network,AOV)是一种可以反映各个工程顶点先后关系的一种有向图,通过拓扑排序,我们可以得到这些活动先后执行的一个合理顺序。

640.png


  • 拓扑排序算法
  • 从有向图中输出没有前驱的节点,即那些入度为0的节点
  • 将输出的节点在原图中删除并删除由其发出的边
  • 重复前面两个步骤,直到没有节点输出为止
  • 关于拓扑排序的思考
  • 如果一个有向图存在回路,那么拓扑排序输出的节点必然会少于节点总数。
  • 拓扑排序关注的是节点的入度
  • 拓扑排序代码实现


640.png


public class Main {
    public static void main(String[] args) {
        int[][] edges = new int[][]{{1,6},{1,2},{0,2},{0,3},{6,5},{2,5},{2,3},{5,4},{3,7},{4,9},{7,9},{7,8}};
        LinkGraph linkGraph = new LinkGraph(10,edges);
        // 计算每个节点的入度
        int[] inDegree = new int[10];
        for(int i = 0; i<linkGraph.graph.length; i++){
            EdgeNode edgeNode = linkGraph.graph[i].neighbors;
            while(edgeNode!=null){
                //计算出每个节点的入度
                inDegree[edgeNode.no]++;
                edgeNode = edgeNode.next;
            }
        }
        Queue<Integer> queue = new LinkedList<>();
        // 初始化队列
        for(int i=0;i<inDegree.length;i++){
            if(inDegree[i]==0){
                queue.offer(i);
            }
        }
        while(!queue.isEmpty()){
            int cur = queue.poll();
            // 输出一个入度为0的节点
            System.out.println("节点 "+cur);
            // 取出cur的邻居节点
            EdgeNode edgeNode = linkGraph.graph[cur].neighbors;
            while(edgeNode!=null){
                inDegree[edgeNode.no]--;
                // 删除当前节点后如果存在入度为0的节点就加入队列中
                if(inDegree[edgeNode.no]==0){
                    queue.offer(edgeNode.no);
                }
                edgeNode = edgeNode.next;
            }
        }
    }
}


  • 拓扑排序可以解决的问题
  • LeetCode上面关于课程表的问题,如果给出一个学生学习的课程之间不同的先导课程,那么请给出一个合理的课程安排顺序,要求保证每门课程学习之前都已经学习过这门课程的先导课了。
  • 针对这种输出次序有先后要求的问题,可以考虑使用拓扑排序来解决。
相关文章
|
10月前
|
自然语言处理 算法 机器人
2025年热门智能客服机器人评测:哪款更好用?
2025年,智能客服机器人市场竞争激烈,功能日益强大。主要品牌如合力亿捷、阿里云、华为云、京东京小智和小米商城等纷纷推出具备精准语音识别、语义理解、多渠道接入等功能的产品,广泛应用于电商、金融、零售等领域,显著提升客服效率与客户满意度,降低企业运营成本。
881 0
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
486 0
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
426 19
C#与Java
|
前端开发 Java 数据库
SpringBoot返回枚举对象中的所有属性以对象的形式返回(一个@JSONType解决)
SpringBoot返回枚举对象中的所有属性以对象的形式返回(一个@JSONType解决)
980 0
|
Web App开发 缓存 网络协议
HTTP3版本和实现验证
这篇文章详细介绍了HTTP3协议及其与HTTP2的比较,解释了HTTP3基于QUIC协议的工作原理,包括0-RTT恢复、H3-29草案等技术细节,并提供了验证网站HTTP3支持和浏览器支持的工具和方法。
771 1
|
安全 网络协议 测试技术
firewalld高级配置,富语言、以及防火墙应用
firewalld高级配置,富语言、以及防火墙应用
794 0
|
存储 设计模式 算法
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景(一)
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景
1008 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的视频点播系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的视频点播系统的详细设计和实现(源码+lw+部署文档+讲解等)
271 0
使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示
使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示
426 1
|
文件存储 iOS开发 Windows
在服务器的raid1中安装windows server系统(踩坑记录)
在服务器的raid1中安装windows server系统(踩坑记录)
在服务器的raid1中安装windows server系统(踩坑记录)