对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列,

使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如今v之前。

通常,这种线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

简单的说。由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序.

步骤:

由AOV网构造拓扑序列的拓扑排序算法主要是循环运行下面两步,直到不存在入度为0的顶点为止。
(1) 选择一个入度为0的顶点并输出之。
(2) 从网中删除此顶点及全部出边。

循环结束后,若输出的顶点数小于网中的顶点数。则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列.

代码段例如以下:

  1. //拓扑排序图AOE代码段
  2. //杨鑫
  3. /*
  4. *在一个表示project的有向图。用顶点表示活动,用弧表示活动之间的优先关系,
  5. *这种有向图为顶点表示活动的网。我们称为AOV(Activity On Vertex Network)
  6. * */
  7.  
  8. //边表结点
  9. #define MAXVEX 1000
  10. typedef struct EdgeNode
  11. {
  12. int adjvex; //邻接点域。存储该顶点相应的下标
  13. int weight; //用于存储权值,对于非网图能够不须要
  14. struct EdgeNode *next; //链域。指向下一个邻接点
  15. }EdgeNode;
  16.  
  17. //顶点表结点
  18. typedef struct VertexNode
  19. {
  20. int in; //顶点的入度
  21. int data; //顶点域,存储顶点信息
  22. EdgeNode *firstedge; //边表头指针
  23. }VertexNode, AdjList[MAXVEX];
  24.  
  25. typedef struct
  26. {
  27. AdjList adjList;
  28. int numVertexes, numEdges; //图中当前的顶点数和边数
  29. }graphAdjList, *GraphAdjList;
  30.  
  31. //此处还应该定义一个栈来存储入度为0的顶点。目的是为了避免每次查找都要去遍历顶点表
  32. //找有没有入度为0的顶点
  33.  
  34. //拓扑排序。若GL无回路,则输出拓扑排序序列并返回结果OK,若没有回路返回ERROR
  35. Status TopologicalSort(GraphAdjList GL)
  36. {
  37. EdgeNode *e;
  38. int i, k, gettop;
  39. int top = 0; //用于栈指针下标
  40. int count = 0; //用于统计输出的顶点数量
  41. int *stack; //建栈存储入度为0的顶点
  42. stack = (int *)malloc(GL->numVertexes * sizeof(int));
  43. for(i = 0; i < GL->numVertexes; i++)
  44. {
  45. if(GL->adjList[i].in == 0)
  46. {
  47. stack[++top] = i; //将入度为0的顶点入栈
  48. }
  49. }
  50.  
  51. while(top != 0)
  52. {
  53. gettop = stack[top--]; //出栈
  54. printf("%d -> ", GL->adjList[gettop].data); //打印出栈数据
  55. count++; //统计出栈数据
  56. //对此顶点弧表遍历
  57. for(e = GL->adjList[gettop].firstedge; e; e = e->next)
  58. {
  59. k = e->adjvex;
  60. //将K号顶点的邻接点的入度减1
  61. if(!(--GL->adjList[k].in))
  62. {
  63. stack[++top] = k; //若为0则入栈,以方便下次循环输出
  64. }
  65. }
  66.  
  67. }
  68.  
  69. if(count < GL->numVertexes) //假设count小于顶点数,说明存在环
  70. return ERROR;
  71. else
  72. return OK;
  73. }

拓扑排序---AOV图的更多相关文章

  1. 数据结构之---C语言实现拓扑排序AOV图

    //有向图的拓扑排序 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define ...

  2. AOV图与拓扑排序&AOE图与关键路径

    AOV网:所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动.若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV网. 拓扑排序算 ...

  3. hdu 2647 Reward(拓扑排序+反图)

    题目链接:https://vjudge.net/contest/218427#problem/C 题目大意: 老板要给很多员工发奖金, 但是部分员工有个虚伪心态, 认为自己的奖金必须比某些人高才心理平 ...

  4. 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)

    [描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...

  5. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

  6. [LeetCode] 207. 课程表(拓扑排序,BFS)

    题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量 ...

  7. 拓扑排序(topsort)

    本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...

  8. [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  9. POJ2762 Going from u to v or from v to u? 强连通分量缩点+拓扑排序

    题目链接:https://vjudge.net/contest/295959#problem/I 或者 http://poj.org/problem?id=2762 题意:输入多组样例,输入n个点和m ...

随机推荐

  1. 浅讲ajax

    1.ajax入门案例 1.1 搭建Web环境 ajax对于各位来说,应该都不陌生,正因为ajax的产生,导致前台页面和服务器之间的数据传输变得非常容易,同时还可以实现页面的局部刷新.通过在后台与服务器 ...

  2. go之for循环

    一.基于计数器的迭代 格式 for 初始化语句; 条件语句; 修饰语句{} 实例 package main import "fmt" func main(){ for i:=0;i ...

  3. 一、SQL系列之~使用SQL语言导出数据及实现定时导出数据任务

    一般情况下,SQL数据库中带有导入与导出数据的直接按键操作,点击数据表所在的数据库--任务--导出/导入数据,根据导入/导出向导直接将数据导出即可. 但导出的数据格式多为Excel格式,如果需要导出的 ...

  4. oracle中sum求和问题

    如列表所示:都是选填字段name   age salary weight张三     18      20李四     17王五     21燕小六  15      22 sum(age+salar ...

  5. 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。

    练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...

  6. 【Linux】swap分区简介及空间增加方式

    swap分区简介 Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存 ...

  7. SQL Server存储过程作业(二)

    阶段1:练习——统计某类型客房的入住客人人数 需求说明 使用存储过程统计在指定类型的客房入住客人的总人数 提示: 存储过程的输入参数是指定的客房类型名称 USE Hotel GO --阶段1:查询入住 ...

  8. dubbo之只订阅及只注册

    只订阅 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却 ...

  9. EKF优化:协方差coff计算公式、意义、Code优化

    复习!复习! 原文链接:http://blog.csdn.net/goodshot/article/details/8611178 1.代码: Matlab相关系数的意义: Eigen::Matrix ...

  10. git解决内容冲突

    内容冲突的冲突处理 两个用户修改了同一个文件的同一块区域,git会报告内容冲突. 解决办法:打开发生冲突的文件,会发现 <<<<<<< HEADtest in ...