基础介绍

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。
拓扑排序时的图结构:

/*第一步:找到所有入读为0的顶点,并将其压栈第二步:从栈中pop出一个顶点,将其所连接的顶点的入度都减1循环前两步,直到栈空,此时应该也没有了入度为q的顶点,如果有,说明图中出现了环
*/#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXEDGE 20
#define MAXVEX 14
#define INFINITY 65535typedef int Status;   /* Status是函数的类型,其值是函数结果状态代码,如OK等 *//* 邻接矩阵结构 */
typedef struct
{int vexs[MAXVEX];int arc[MAXVEX][MAXVEX];int numVertexes, numEdges;
}MGraph;/* 邻接表结构****************** */
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;
/* **************************** */void CreateMGraph(MGraph* G)/* 构件图 */
{int i, j;/* printf("请输入边数和顶点数:"); */G->numEdges = MAXEDGE;G->numVertexes = MAXVEX;for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{G->vexs[i] = i;}for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{for (j = 0; j < G->numVertexes; j++){G->arc[i][j] = 0;}}G->arc[0][4] = 1;G->arc[0][5] = 1;G->arc[0][11] = 1;G->arc[1][2] = 1;G->arc[1][4] = 1;G->arc[1][8] = 1;G->arc[2][5] = 1;G->arc[2][6] = 1;G->arc[2][9] = 1;G->arc[3][2] = 1;G->arc[3][13] = 1;G->arc[4][7] = 1;G->arc[5][8] = 1;G->arc[5][12] = 1;G->arc[6][5] = 1;G->arc[8][7] = 1;G->arc[9][10] = 1;G->arc[9][11] = 1;G->arc[10][13] = 1;G->arc[12][9] = 1;}/* 利用邻接矩阵构建邻接表 */
void CreateALGraph(MGraph G, GraphAdjList* GL)
{int i, j;EdgeNode* e;*GL = (GraphAdjList)malloc(sizeof(graphAdjList));(*GL)->numVertexes = G.numVertexes;(*GL)->numEdges = G.numEdges;for (i = 0; i < G.numVertexes; i++) /* 读入顶点信息,建立顶点表 */{(*GL)->adjList[i].in = 0;(*GL)->adjList[i].data = G.vexs[i];(*GL)->adjList[i].firstedge = NULL;     /* 将边表置为空表 */}for (i = 0; i < G.numVertexes; i++) /* 建立边表 */{for (j = 0; j < G.numVertexes; j++){if (G.arc[i][j] == 1){e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = j;                    /* 邻接序号为j  */e->next = (*GL)->adjList[i].firstedge;  /* 将当前顶点上的指向的结点指针赋值给e */(*GL)->adjList[i].firstedge = e;        /* 将当前顶点的指针指向e  */(*GL)->adjList[j].in++;}}}}
/* 拓扑排序,若GL无回路,则输出拓扑排序序列并返回1,若有回路返回0。 */
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 (0 == GL->adjList[i].in) /* 将入度为0的顶点入栈 */stack[++top] = i;while (top != 0){gettop = stack[top--];printf("%d -> ", GL->adjList[gettop].data);count++;        /* 输出i号顶点,并计数 */for (e = GL->adjList[gettop].firstedge; e; e = e->next){k = e->adjvex;if (!(--GL->adjList[k].in))  /* 将i号顶点的邻接点的入度减1,如果减1后为0,则入栈 */stack[++top] = k;}}printf("\n");if (count < GL->numVertexes)return ERROR;elsereturn OK;
}int main(void)
{MGraph G;GraphAdjList GL;int result;CreateMGraph(&G);CreateALGraph(G, &GL);result = TopologicalSort(GL);printf("result:%d", result);return 0;
}

大话数据结构:拓扑排序相关推荐

  1. 数据结构 拓扑排序、AOV 、AOE、关键路径

    AOV (Activity On Vertex) 活动在顶点上 AOV 网: 强调的是在一个完整的过程中,各个活动所发生的顺序 其中用顶点表示活动,用弧表示活动之间的优先关系,例如:在 ? 图中,活动 ...

  2. 大话数据结构 :排序

    排序算法概要 冒泡排序和快速排序 快速排序是冒泡排序的升级,冒泡排序的算法性能较低时间性能O(n2),而快速排序平均可以达到o(nlogn).冒泡排序就是两两比较,直到所有的位置都是有序排列的数据.而 ...

  3. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  4. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  5. 数据结构-图论-拓扑排序模板题(hdu3342)(poj1270)(hdu4857)

    dfs与bfs的很直接的应用就是拓扑排序. 拓扑排序如果用数组来模拟链表进行操作,既解决了稀疏图的空间问题,又解决了用链表进行操作麻烦的问题 但是拓扑排序并不是数字大小之间的排序,而是某些事情之间的顺 ...

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

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

  7. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

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

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

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

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

最新文章

  1. 微软亚研院:如何看待计算机视觉未来的走向?
  2. 2017蓝桥杯省赛---java---B---1(购物单)
  3. 避免Eclipse经常出现Out Of Memory
  4. DeepLearningAI 学习笔记 1.3 浅层 logistic 神经网络
  5. Java 跌落神坛,Python 继续夺冠....凭啥?
  6. python用户输出怎么命名变量_python变量及用户交互,用户名格式化输出
  7. python核心编程;可以帮你提高Python编程效率十条建议
  8. 计算机组成原理 笔记 第二版 唐朔飞
  9. Ubuntu GCC编译器升级
  10. windows下一键修改IP地址
  11. msfconsole理论
  12. 网站盈利模式分析分类
  13. 如何通俗理解设计模式及其思想
  14. k3导入账套_k3新建帐套如何导入会计科目
  15. Android 平台应用使用RxAndroid
  16. 计算机数据的平均函数是,excel软件中数据的平均值怎么求取
  17. Octopus和Humphrey PDF解析
  18. 桌面频谱挂件——持续更新
  19. 三大原创IP首次合体亮相 乐元素聚乐中国“网络文学+ ”大会
  20. Podman 入门指南

热门文章

  1. Ajax,再生还是幻灭---好文推荐
  2. java中elements_Java中的提供程序elements()方法
  3. github项目怎么运行_利用 GitHub 从零开始搭建一个博客
  4. 谷歌离线地图Api附获取教程
  5. GrepWin:Win7下的文本替换工具
  6. 自己动手写js分享插件 [支持https] (QQ空间,微信,新浪微博。。。)
  7. Linux命令TOP TEN
  8. 大数据打造你的变美频道——数加平台上小红唇的大数据实践
  9. 【Hadoop Summit Tokyo 2016】Hivemall: Apache Hive/Spark/Pig 的可扩展机器学习库
  10. Android学习笔记——数据库