在一个软件project项目中,有些任务须要在另外一个任务完毕之后才干完毕,这样的任务在软件project中是很常见的。下图就展示了一个软件项目的依赖情况。

这张图很明显,就是一张有向图。那么,如今问题就来了,怎样输出任务的完毕顺序呢?

这个问题有一个前提条件,就是有向图中不能出现回路。

算法的基本思想就是在每次dfs返回时将顶点增加到返回结果中。

所以代码能够这样写:

import java.util.Stack;public class DepthFirstOrder {private boolean[] visited;private Stack<Integer> postOrder = new Stack<Integer>();public DepthFirstOrder(Graph G) {visited = new boolean[G.V()];for (int v = 0; v < G.V(); v++) { // 注意:这句话不能遗漏。这句话保证了全部的任务都可以被运行到。dfs(G, v);}}public Iterable<Integer> sort() {return postOrder;}private void dfs(Graph G, int s) {visited[s] = true;for (int i : G.adj(s)) { // 注意:这个地方是迭代邻居顶点而不是全部顶点if (!visited[s]) {dfs(G, i);}}postOrder.add(s);}
}

回路检測

这个算法还能够找出一个有向图中是否含有回路。

回路检測在Java中有应用的。

比方一段Java代码写成这样,循环继承,那么编译的时候就会报错。

public class A extends B {
}public class B extends C {
}public class C extends A {
}

在微软的Excel中也有应用,比方三个格子中含有循环的引用,这时候就会出现错误消息。

算法7-10:拓扑排序相关推荐

  1. 【Python排序搜索基本算法】之拓扑排序

    [Python排序搜索基本算法]之拓扑排序 版权声明:本文为博主原创文章,未经博主允许不得转载.

  2. 【数据结构与算法】【算法思想】拓扑排序

    一.拓扑排序 拓扑排序是基于依赖关系的节点,根据依赖关系而生成的序列.节点和依赖关系往往要生成有向无环图.类似的问题有:穿衣服裤子的先后关系,生成穿衣序列/专业课程与前置课程形成的课程学习序列/代码编 ...

  3. 图论算法—图的拓扑排序介绍和Kahn算法原理解析以及Java代码的实现

    详细介绍了图的拓扑排序的概念,然后介绍了求拓扑序列的算法:Kahn算法的原理,最后提供了基于邻接矩阵和邻接表的图对该算法的Java实现. 阅读本文需要一定的图的基础,如果对于图不是太明白的可以看看这篇 ...

  4. C#最短路Dijkstra算法与根据拓扑排序的label-correcting算法

    这里写自定义目录标题 基本原理 基本原理 Dij算法和拓扑拍讯的基本原理很多这里不多说,dij算法核心思想就是理解T集合与P集合的含义,并且在程序执行时候记录每个节点的前级节点,可以求解一个点到其他所 ...

  5. 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

    十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...

  6. 算法:图(Graph)的遍历、最小生成树和拓扑排序

    背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...

  7. 有向图的拓扑排序算法JAVA实现

    一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径--并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...

  8. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  9. 数据结构与算法——31. 图的应用:拓扑排序、强连通分支、最短路径问题、最小生成树

    文章目录 一.拓扑排序(Topological Sort) 实现思路 二.强连通分支 1. 转置的概念 2. 强连通分支算法:Kosaraju算法思路 三.最短路径问题 1. 最短路径问题:Dijks ...

最新文章

  1. 【OH】Oracle软件安装需要的软件包(官方文档)
  2. javaweb添加拦截器
  3. python27安装-二、Python2.7的安装并与Python3.8共存
  4. dell笔记本指示灯闪烁_带你认识电脑电源状态指示灯不同亮度不同含义
  5. respberry pi3 上手随记
  6. 导致散户亏损的三大根源
  7. MongoDB,凉凉?
  8. python网络爬虫系列(二)——ProxyHandler处理器实现代理IP
  9. 使用Docker Compose管理多个容器
  10. 干货集中营 ReactiveCocoa+RXSwift+MVVM
  11. html5 多文件选择
  12. redis 命令别名_redis 命令、命令行根据前缀(通配符)批量删除redis存储的key
  13. mysql数据库最多列_mysql多列索引和最左前缀
  14. 2020年中国人口出生率为8.52‰,首次跌破10‰,创下1978来新低
  15. 今日GitHub热榜第一:最全中华古诗词数据库,收录30多万诗词
  16. 手把手带你将手机打造一台私人便捷服务器及私人云盘
  17. PCB正片和负片的个人理解
  18. Bmob后端云上传多张图片
  19. Softer-NMS
  20. android10热点验证身份,通过Android的AccountManager类进行Twitter身份验证

热门文章

  1. TensorFlow模型实现:UNet模型
  2. C++常用方法笔记资料
  3. Android Studio出现UnsupportedClassVersionError Unsupported major.minor version 52.0
  4. 设计模式—工厂模式之简单工厂模式
  5. 第二章节 怀疑的练习和不会的练习
  6. php-5.6.26源代码 - opcode执行
  7. jdk1.8之HashMap
  8. 那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分
  9. mysql 根据地图 坐标 查询 周边景区、酒店
  10. Installshield x:实现序列号检验,获取用户信息并写入指定_ini文件1 - 子夜 MySpace聚友博客...