拓扑排序---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 ...
随机推荐
- android 自定义view 前的基础知识
本篇文章是自己自学自定义view前的准备,具体参考资料来自 Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了 ...
- PHP CURL抓取网页 simple_html_dom类
抓取网页数据后 数据录入到discuz中 <?php include('simple_html_dom.php'); function urlText(){ $url = 'http://www ...
- Oracle11g聚合函数
聚合函数就是基于多行数据返回一行结果,下面就是Oracle提供的一些列聚合函数: AVG COLLECT CORR CORR_* COUNT COVAR_POP COVAR_SAMP CUME_DIS ...
- office 2010 破解
使用Rearm命令激活延迟重置Office 20101.安装Offcie 2010 安装Offcie 2010,默认30天的试用期,这里要注意,上文提供的Office 2010是零售版,所以没有序列号 ...
- 5.26 Quartz任务调度图解2
- 详细解读css中的浮动以及清除浮动的方法
对于前端初学者来说,css浮动部分的知识是一块比较难以理解的部分,下面我将把我学习过程中的心得分享给大家. 导读: 1.css块级元素讲解 2.css中浮动是如何产生的 3.出现浮动后,如何清除浮 ...
- POJ_2186_Popular Cows_强连通分量
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 30680 Accepted: 12445 De ...
- Python中join函数和os.path.join用法
Python中有join和os.path.join()两个函数,具体作用如下: join:连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 os.path.jo ...
- centos7网卡重命名为ethx格式
参考:https://www.cnblogs.com/zyd112/p/8143464.html CentOS 7 使用 eth0 这样的传统名称,那么在安装启动(pxe)时,按Tab键在下方输入以下 ...
- spring cloud(五) hystrix
开启feign 熔断 hystrix 整合hystrix-dashboard监控面板 1. 服务调用者boot工程 pom引入依赖 <!-- hystrix-dashboard 监控依赖 ...