当前位置: 首页 > news >正文

图论16-拓扑排序

文章目录

  • 1 拓扑排序
  • 2 拓扑排序的普通实现
    • 2.1 算法实现 - 度数为0入队列
    • 2.2 拓扑排序中的环检测
  • 3 深度优先遍历的后续遍历
    • 3.1 使用环检测类先判断是否有环
    • 3.2 调用无向图的深度优先后续遍历方法,进行DFS

1 拓扑排序

  • 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。

  • 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序

2 拓扑排序的普通实现

在这里插入图片描述

在这里插入图片描述

2.1 算法实现 - 度数为0入队列

Queue<Integer> q = new LinkedList<>();for(int v = 0; v < G.V(); v ++){indegrees[v] = G.indegree(v);//入度度数为0的入队,找源点if(indegrees[v] == 0) q.add(v);
}while(!q.isEmpty()){ // 如果有环,那么环上的点从入口开始就无法进入队列int cur = q.remove();//相邻的顶点入队res.add(cur);//相邻的顶点入度都减1for(int next: G.adj(cur)){indegrees[next] --;// 入度为0的直接入队if(indegrees[next] == 0) q.add(next);}
}

2.2 拓扑排序中的环检测

能够进行拓扑排序的图是没有环的,否则无法进行拓扑排序。
在拓扑排序的实现过程中,如果返回的res数组中的点的数量与图的点的数量不一致,则说明有环。因为环上的点由于度数无法为0,无法进入队列,从而进入res数组返回答案。
在这里插入图片描述

if(res.size() != G.V()){hasCycle = true;res.clear();
}

3 深度优先遍历的后续遍历

在这里插入图片描述

  • 根节点最后遍历,讲得到的序列反过来,就是拓扑排序,但是这种方法无法实现环检测。
    在这里插入图片描述

3.1 使用环检测类先判断是否有环

private boolean hasCycle = false;hasCycle = (new DirectedCycleDetection(G)).hasCycle();if(hasCycle) return;

3.2 调用无向图的深度优先后续遍历方法,进行DFS

GraphDFS dfs = new GraphDFS(G);for(int v: dfs.post())res.add(v);
http://www.lryc.cn/news/231800.html

相关文章:

  • SecureCRT 9.4.2最新终端SSH工具
  • 基于python+django的美食餐厅点餐订餐网站
  • Moka人事:实现无代码开发的API连接,打通电商平台与用户运营系统
  • 【Spring】超详细讲解AOP(面向切面编程)
  • 界面组件DevExpress Reporting v23.1亮点 - 全新升级报表查看器
  • 电容容量换算电池容量,以及RTC持续时间计算
  • 【BIM入门实战】高程点无法放置的解决方法
  • CRM系统对科技企业有哪些帮助
  • 用excel计算一个矩阵的转置矩阵
  • WPF 中的 ControlTemplate 和 DataTemplate 有什么区别
  • 3D重建相关
  • 字符串数组排序(Java/JavaScript代码版)
  • 调用电商集成平台 聚水潭 api接口示例
  • 深入Rust:探索所有权和借用机制
  • Python之冒泡排序(AI自动写文章项目测试)
  • spring cloud微服务中多线程下,子线程通过feign调用其它服务,请求头token等丢失
  • Nacos 高级玩法:深入探讨分布式配置和服务发现
  • CCF CSP认证历年题目自练Day45
  • outlook群发邮件
  • 【Attack】针对GNN-based假新闻检测器
  • APIcloud 【现已更名 用友开发中心】 iOS发版 应用程序请求用户同意访问相机和照片,但没有在目的字符串中充分说明相机和照片的使用。
  • 记一次弱口令之后引发的获取服务器权限
  • AJAX入门Day01笔记
  • spring boot 环境变量问题
  • Javaweb开发 利用servlet+jsp+jdbc+tomcat数据库实现登录功能
  • flutter下拉列表
  • ElastaticSearch -- es深度分页 searchAfter
  • 【2021集创赛】Arm杯二等奖-基于Arm核的智慧病房手势识别方案
  • 通过注解统计接口调用耗时
  • Oracle-动态sql学习笔记,由易至难讲解七个例子