拓扑排序---AOV图
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列,
使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如今v之前。
通常,这种线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
简单的说。由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序.
步骤:
循环结束后,若输出的顶点数小于网中的顶点数。则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列.
代码段例如以下:
- //拓扑排序图AOE代码段
- //杨鑫
- /*
- *在一个表示project的有向图。用顶点表示活动,用弧表示活动之间的优先关系,
- *这种有向图为顶点表示活动的网。我们称为AOV(Activity On Vertex Network)
- * */
- //边表结点
- #define MAXVEX 1000
- typedef struct EdgeNode
- {
- int adjvex; //邻接点域。存储该顶点相应的下标
- int weight; //用于存储权值,对于非网图能够不须要
- struct EdgeNode *next; //链域。指向下一个邻接点
- }EdgeNode;
- //顶点表结点
- typedef struct VertexNode
- {
- int in; //顶点的入度
- int data; //顶点域,存储顶点信息
- EdgeNode *firstedge; //边表头指针
- }VertexNode, AdjList[MAXVEX];
- typedef struct
- {
- AdjList adjList;
- int numVertexes, numEdges; //图中当前的顶点数和边数
- }graphAdjList, *GraphAdjList;
- //此处还应该定义一个栈来存储入度为0的顶点。目的是为了避免每次查找都要去遍历顶点表
- //找有没有入度为0的顶点
- //拓扑排序。若GL无回路,则输出拓扑排序序列并返回结果OK,若没有回路返回ERROR
- Status TopologicalSort(GraphAdjList GL)
- {
- EdgeNode *e;
- int i, k, gettop;
- int top = 0; //用于栈指针下标
- int count = 0; //用于统计输出的顶点数量
- int *stack; //建栈存储入度为0的顶点
- stack = (int *)malloc(GL->numVertexes * sizeof(int));
- for(i = 0; i < GL->numVertexes; i++)
- {
- if(GL->adjList[i].in == 0)
- {
- stack[++top] = i; //将入度为0的顶点入栈
- }
- }
- while(top != 0)
- {
- gettop = stack[top--]; //出栈
- printf("%d -> ", GL->adjList[gettop].data); //打印出栈数据
- count++; //统计出栈数据
- //对此顶点弧表遍历
- for(e = GL->adjList[gettop].firstedge; e; e = e->next)
- {
- k = e->adjvex;
- //将K号顶点的邻接点的入度减1
- if(!(--GL->adjList[k].in))
- {
- stack[++top] = k; //若为0则入栈,以方便下次循环输出
- }
- }
- }
- if(count < GL->numVertexes) //假设count小于顶点数,说明存在环
- return ERROR;
- else
- return OK;
- }
拓扑排序---AOV图的更多相关文章
- 数据结构之---C语言实现拓扑排序AOV图
//有向图的拓扑排序 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define ...
- AOV图与拓扑排序&AOE图与关键路径
AOV网:所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动.若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV网. 拓扑排序算 ...
- hdu 2647 Reward(拓扑排序+反图)
题目链接:https://vjudge.net/contest/218427#problem/C 题目大意: 老板要给很多员工发奖金, 但是部分员工有个虚伪心态, 认为自己的奖金必须比某些人高才心理平 ...
- 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)
[描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- [LeetCode] 207. 课程表(拓扑排序,BFS)
题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量 ...
- 拓扑排序(topsort)
本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...
- [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 ...
- 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 ...
随机推荐
- 浅讲ajax
1.ajax入门案例 1.1 搭建Web环境 ajax对于各位来说,应该都不陌生,正因为ajax的产生,导致前台页面和服务器之间的数据传输变得非常容易,同时还可以实现页面的局部刷新.通过在后台与服务器 ...
- go之for循环
一.基于计数器的迭代 格式 for 初始化语句; 条件语句; 修饰语句{} 实例 package main import "fmt" func main(){ for i:=0;i ...
- 一、SQL系列之~使用SQL语言导出数据及实现定时导出数据任务
一般情况下,SQL数据库中带有导入与导出数据的直接按键操作,点击数据表所在的数据库--任务--导出/导入数据,根据导入/导出向导直接将数据导出即可. 但导出的数据格式多为Excel格式,如果需要导出的 ...
- oracle中sum求和问题
如列表所示:都是选填字段name age salary weight张三 18 20李四 17王五 21燕小六 15 22 sum(age+salar ...
- 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。
练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...
- 【Linux】swap分区简介及空间增加方式
swap分区简介 Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存 ...
- SQL Server存储过程作业(二)
阶段1:练习——统计某类型客房的入住客人人数 需求说明 使用存储过程统计在指定类型的客房入住客人的总人数 提示: 存储过程的输入参数是指定的客房类型名称 USE Hotel GO --阶段1:查询入住 ...
- dubbo之只订阅及只注册
只订阅 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却 ...
- EKF优化:协方差coff计算公式、意义、Code优化
复习!复习! 原文链接:http://blog.csdn.net/goodshot/article/details/8611178 1.代码: Matlab相关系数的意义: Eigen::Matrix ...
- git解决内容冲突
内容冲突的冲突处理 两个用户修改了同一个文件的同一块区域,git会报告内容冲突. 解决办法:打开发生冲突的文件,会发现 <<<<<<< HEADtest in ...