目录

一、什么是拓扑排序?

二、拓扑排序:基本概念

三、拓扑排序:分析

四、拓扑排序:步骤

五、拓扑排序:实现

六、练习


一、什么是拓扑排序?

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

二、拓扑排序:基本概念

问题:

  1. 假设以有向图表示一个工程的施工图或程序的数据流图,则图中不允许出现回路
  2. 检查有向图是否存在回路的方法之一,是对有向图进行==拓扑排序==。有回路,不是存在拓扑排序;没有回路,存在拓扑排序
  3. 一个无环的有向图称为有向无环图(Directed Acycline Graph),简称为DAG图。

  4. 通常我们用一个有向图的顶点表示活动,边表示活动间先后关系,这样的有向图称为顶点活动网(Activity On Vertex network),简称AOV网。

    • 工程是否顺利进行

    • 完成整个工程所必须的最短时间

    • 在AOV网表示工程的施工图,若出现==环==,标明该工程的施工设计图存在问题。

    • 若AOV网表示的是数据流图,若出现==环==,标明存在死循环。

  5. 拓扑排序:对一个有向图构建拓扑序列的过程。

三、拓扑排序:分析

判断有向网是否存在有向环的一个方法:(对AOV网进行拓扑排序)

  • 构造一个包含图中所有顶点的”拓扑排序序列“。

  • 若在AOV网中存在一条从顶点u到顶点v的弧,则在==拓扑有序序列中顶点u必然优先于顶点v==。

  • 若在AOV网中顶点u和顶点w之间没有弧,则在拓扑有序序列中,这两个顶点的先后次序关系可以==随意==

现有如下课程,并能够绘制下方有向图:

实例1:存在拓扑序列abcefdgh,说明不存在环

实例2:不存在拓扑序列,说明存在环fdghf


四、拓扑排序:步骤

  • 步骤:

1. 在AOV网中选择一个没有前驱的顶点并输出

2. 从AOV网中删除该顶点以及从它出发的弧

3. 重复1和2直到AOV网为空(即已输出所有的顶点),或剩余子图中不存在没有前驱的顶点。后一种情况说明该AOV网中存在有向环。

  • 算法要考虑的问题:

1. “没有前驱”如何判断

2. “删除顶点及以它为尾的弧”如何操作

  • 解决方法:

1. 以==入度为零==作为没有前驱的量度

2. 算法中预设一个栈,用于保存当前出现的入度为零的顶点

3. 删除顶点及以它为尾的弧的这类操作,可用“弧头顶点的入度减1”的办法来替代。

五、拓扑排序:实现

  • 由于拓扑排序中对图的主要操作是“找从顶点出发的弧”,并且AOV网在多数情况下是稀疏图,因此存储结构取==邻接表==为宜。

public class TopologicalSort {// 拓扑排序public static boolean topologicalSort(ALGraph G) throws Exception {int count = 0;// 输出定点计数int[] indegree = findInDegree(G);// 求各顶点入度LinkStack S = new LinkStack();// 建零入度顶点栈for (int i = 0; i < G.getVexNum(); i++)if (indegree[i] == 0)// 入度为0者进栈S.push(i);while (!S.isEmpty()) {int i = (Integer) S.pop(); // 栈不空 取栈顶元素System.out.print(G.getVex(i) + " ");// 输出V号顶点 并 计数++count;for (ArcNode arc = G.getVexs()[i].firstArc; arc != null; arc = arc.nextArc) {int k = arc.adjVex;if (--indegree[k] == 0)// 对i号顶点的每个邻接点的入度减1S.push(k);// 若入度减为0,则入栈}}if (count < G.getVexNum())return false;//该有向图有回路elsereturn true;}//求各顶点入度  算法6.11public static int[] findInDegree(ALGraph G) throws Exception {int[] indegree = new int[G.getVexNum()];for (int i = 0; i < G.getVexNum(); i++)for (ArcNode arc = G.getVexs()[i].firstArc; arc != null; arc = arc.nextArc)++indegree[arc.adjVex];// 入度增加1return indegree;}public static void main(String[] args) throws Exception {ALGraph G = GenerateGraph.generateALGraph();TopologicalSort.topologicalSort(G);}
}// 调试结果:
// v1 v2 v3 v5 v7 v4 v6 v8 v9
  • 拓扑排序算法总的时间复杂度:O(n+e)

六、练习

试列出下图中,全部可能的拓扑有序序列:

【数据结构】什么是拓扑排序—关于图的拓扑排序相关推荐

  1. 【数据结构/C语言版】【图】拓扑排序

    拓扑排序 拓扑排序是对图结点关系进行的排序,其排序结果提供了一种无后效性的遍历图的方式,即:后续结点不会影响之前的结点.此性质可用于动态规划.关键路径等. 进行拓扑排序需要注意:1.需要了解图的度(入 ...

  2. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  3. aov建立Java模拟,数据结构之---C语言实现拓扑排序AOV图

    //有向图的拓扑排序 //杨鑫 #include #include #include #define MAX_NAME 3 #define MAX_VERTEX_NUM 20 typedef int ...

  4. 数据结构与算法之-----图(拓扑排序)

    [​​​​​​​ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...

  5. 考研复习之数据结构笔记(十二)图(下)(图的应用,包含最小生成树、最短路径、拓扑排序、关键路径以及单元小结)

    目录 一.图的应用 1.1 最小生成树 (1)基本概念与问题引入 (2)Prim(普里姆)算法 (3)Kruskal(克鲁斯卡尔)算法 1.2 最短路径 (1)基本概念与问题引入 (2)Dijkstr ...

  6. 【算法数据结构体系篇class16】:图 拓扑排序

    一.图 1)由点的集合和边的集合构成 2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达 3)边上可能带有权值 二.图结构的表达 1)邻接表法 类似哈希表, key就是当前节点.value ...

  7. 数据结构-----图的拓扑排序和关键路径算法

    部分图片取自:http://www.cnblogs.com/navorse/articles/1893863.html 在介绍拓扑排序和关键路径之前,先引入AOE网络的概念: 该图为一个AOE网,顶点 ...

  8. BUCT数据结构——图(拓扑排序、关键路径)

    文章目录 问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式) 问题 B: 算法7-12:有向无环图的拓扑排序 问题 C: 有向图是否存在环? 问题 D: 图-节点的最早发生时间 问题 ...

  9. 数据结构-考研难点代码突破 (C++实现有向无环图的拓扑排序)

    文章目录 1. AOV网 2. 拓扑排序 C++代码 1. AOV网 AOV网∶若用DAG 图(有向无环图)表示一个工程,其顶点表示活动,用有向边<Vi,Vj>表示活动 Vi必须先于活动V ...

最新文章

  1. 大学计算机高级应用学什么,大学计算机高级应用 . 上卷
  2. Err:query must begin with SELECT or FROM
  3. php调整表格样式,表格的创建以及样式修改
  4. 5种常见信用卡还款方式对比
  5. Pentium 4处理器架构/微架构/流水线 (3) - NetBurst微架构
  6. Mysql把查询的列作为判断条件(case函数)
  7. 英文如何区分小括号和花括号
  8. 数据库中的左连接(left join)和右连接(right join)区别
  9. 1.ECMAScript 6简介(阮一峰ES6)
  10. Matlab 口罩识别
  11. 安捷伦的仪器设备出售
  12. 微信公众号前端-上传图片小记
  13. CodeForces 417D Cunning Gena 状压dp
  14. 牛客 13134 牛牛的数列
  15. 安全认证、准入控制、RBAC
  16. python模型预测_用Python如何进行预测型数据分析
  17. 实例示范( 泰坦尼克沉船数据分析之一)
  18. vue-render
  19. Spark Standalone -- 独立集群模式、Spark 提交任务的两种模式、spark在yarn上运行的环境搭建、自己写的spark代码如何提交到yarn上并运行...
  20. 快节奏多人在线游戏网络入门系列教程(2):客户端预测与服务器协调

热门文章

  1. scrapy爬取豆瓣电影信息
  2. C++老鸟日记027 重载、覆盖、隐藏
  3. 多校训练1 A Alice and Bob 博弈
  4. ROWNUM用法--SELECT * FROM T WHERE ROWNUM=1
  5. 无需代码,极简5步大屏可视化教程,3分钟就能轻松做出酷炫报表
  6. 同步任务和异步任务执行过程
  7. 磁场强度单位和磁感应强度单位转换
  8. AMD领先英特尔发表工作频率3.4THz的晶体管 (转)
  9. Android Studio NKD开发之 FFmpeg库的引入--简单播放器(主要验证是否正确引入ffmpeg库)
  10. 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索