如题 自用笔记 如有错误欢迎及时指正

拓补排序需要知道每个顶点的入度情况  求出度入度的方法以及所用数据结构定义见下文

两种存储结构下求有向图顶点出度与入度_kollektor的博客-CSDN博客

https://blog.csdn.net/weixin_46127065/article/details/120631629


算法描述

*已知一个AOV网(用顶点表示活动的DAG(有向无环)图)*

step1.从AOV网中选择一个没有前驱的结点(入度为0)并输出。

step2.从AOV网中删除所有以该顶点为起点的有向弧,同时修改弧对应的顶点入度。

step3.重复step1.与step2.直到所有结点均已输出,或图中不存在没有前驱的结点,结束。

算法实现

借助一个辅助栈栈S来暂存过程中的顶点

(邻接表结构采用入度域与出度域,邻接矩阵结构采用两个入度出度数组存储)

step1.把邻接表中所有出度为0顶点入栈。

step2.栈不空时,输出栈顶顶点(记作Vi)并将其出栈,输出。

找到顶点Vi的直接后继Vj并修改其入度。

当Vj的入度为0时,将其入栈。

step3.重复上述操作,直到栈空为止。

栈空时输出顶点数不等于顶点总数,说明图中有环,拓补排序退出。

否则排序完毕。

代码实现

邻接表实现

//邻接表拓补排序 结果存入数组result中
bool TopologicalSort_AdjList(AdjListGraph ALG,VertexType result[]){SqStack S;      //辅助栈InitStack(S);AdjListGraph G = ALG;       memset(result, -1, G->vexnum);int count = 0;      //计数用 若最后count<G-<vexnum 说明图有回路int i, j;       /* 拓扑 */for (i = 0; i < G->vexnum; i++){        //所有入度为0顶点入栈if(G->List[i].indegree==0){Push(S, i);}}while(!StackEmpty(S)){Pop(S, i);result[count++] = G->List[i].data;        //保存输出结果/* 在Vi边表寻找结点Vi所有直接后继Vj 修改其入度 */for (ArcNode *p = G->List[i].firstarc; p != NULL; p = p->nextarc){G->List[p->adjvex].indegree--;      //修改Vi直接后继顶点Vj的入度if(G->List[p->adjvex].indegree==0){     //修改入度后 Vi后继顶点Vj入度为0 入栈Push(S, p->adjvex);}}/* 在Vi边表寻找结点Vi所有直接后继Vj 修改其入度 */}/* 拓扑 */if(count<G->vexnum){printf("图有回路!\n");return false;}else{printf("拓补序列为:");for (int k = 0; k < G->vexnum;k++){printf("%d->", result[k]);}printf("^\n");return true;}
}

邻接矩阵实现

//邻接矩阵拓补排序 结果存入数组result中
bool TopologicalSort_Matrix(MatrixGraph MTG,VertexType result[]){SqStack S;InitStack(S);MatrixGraph G = MTG;memset(result, -1, G->vexnum);int count = 0;      //计数用 若最后count<G-<vexnum 说明图有回路int i, j;        /* 拓扑 */for (i = 0; i < G->vexnum; i++){        //所有入度为0顶点入栈if(G->InDegree[i]==0){Push(S, i);}}while(!StackEmpty(S)){Pop(S, i);      //出栈result[count++] = G->Vex[i];        //保存结果/* 寻找结点Vi所有直接后继Vj 修改其入度 */for (j = 0; j < G->vexnum; j++){if(i!=j&&G->Edge[i][j]!=INF){     //若<Vi,Vj>边存在G->InDegree[j]--;       //入度减一if(G->InDegree[j]==0){      //入度为0入栈Push(S, j);}}}/* 寻找结点Vi所有直接后继Vj 修改其入度 */}/* 拓扑 */if(count<G->vexnum){printf("图有回路!\n");return false;}else{printf("拓补序列为:");for (int k = 0; k < G->vexnum;k++){printf("%d->", result[k]);}printf("^\n");return true;}
}

图的拓补排序(TopologicalSort)算法在邻接表与邻接矩阵结构下实现相关推荐

  1. 士兵排队问题(拓补排序)(附简要拓补排序思想及算法)

    题目描述 有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道"1 比2 高,7 比 5高"这样的 ...

  2. 每日一题30:拓补排序

    问题描述 所谓拓补排序就是确定图中节点的一种顺序,使得某些在别的节点访问之前不能访问到的节点排在后面.所以该算法的核心是每一步选择一个没有入度的节点,因为没有入度意味着该节点没有前驱,得到一个节点后, ...

  3. 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率

    [BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...

  4. leetcode *210. 课程表 II(拓补排序)(2020.5.17)

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

  5. 51nod-生产口罩(拓补排序+DP)by zyz

    题目:生产口罩 链接:http://class.51nod.com/Classes/Problem.html#courseProblemId=1718&classId=129 //注:题目来自 ...

  6. 奖金(拓补排序的应用)

    谁应该高谁的入度++,并记录下谁比低的高(低的得出度),所以入度为零的就是最低的(好不公平),找出所有最低的,将他们算作一层,奖金++(算是拓补排序吧) #include<cstdio> ...

  7. HDU4324 - Triangle LOVE 拓补排序

    HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include < ...

  8. Aov网络与拓补排序的实现

    测试的节点分布如下: 测试代码如下: /** 拓补排序的实现,使用邻接链表存储有向图 */ #include <iostream> #include <cstdio> #inc ...

  9. 后缀自动机求多个串的最长公共子串+拓补排序讲解+LCS2 - Longest Common Substring II

    网上所有关于后缀自动机拓补排序的文章,都默认读者会拓补排序,简直了. 后缀自动机的拓补排序,就是按照长度进行排序,在进行特定操作的时候,通过较长的后缀来更新较短的后缀.那么也就是通过拓补排序中排名靠后 ...

  10. 【数据结构】邻接表的储存结构 建立图的邻接表算法

    [数据结构]邻接矩阵及其实现 一个图的邻接矩阵的表示是唯一的,但其邻接表表示不唯一,这是因为在邻接表结构中,各便表结点的链接次序取决于建立邻接表时的算法以及输入的次序. 一般而言邻接矩阵适合存储稠密图 ...

最新文章

  1. 我不喜欢Go语言的十个理由
  2. 如果宁静是 Oracle,万茜、张雨绮、黄圣依是什么?
  3. sqoop 数据迁移
  4. resultset需要关闭吗_微信视频号能关闭吗?怎么操作?3秒教你搞定
  5. 论文共读 | “阳奉阴违”的半监督学习算法 - Virtual Adversarial Training
  6. AIR 中 File 对象的几个系统文件夹及其属性.
  7. html缓慢下拉,html - 列表下拉导航-适用于除野生动物园之外的所有浏览器。 间隔开并缓慢 - 堆栈内存溢出...
  8. POJ 3690 找星座(2D匹配)(未解答)
  9. 为什么CAP不能同时满足的简单理解
  10. 三星计划在第二代GalaxyFold上采用屏下摄像头技术
  11. 《中国人工智能学会通讯》——5.4 结 论
  12. 读懂现金贷产品的客群风险标签维度
  13. jq使用教程02_安装的问题
  14. 【SQL】substr截取结果和想象中有差异?
  15. fatal error C1853: 'Debug/***.pch' is not a precompiled header file created with this compil
  16. android wear表盘商店,手里的 Android Wear 太没个性?你该试试这 4 款表盘
  17. aria2 32bit Android,【各版本整合】32/64位Aria2 Tools - 支持RPC协议 AriaNG(客户端+网页版)...
  18. 分析在智能语音对话流程
  19. 哪款分体式蓝牙耳机体验最好?便宜好用的分体式蓝牙耳机!
  20. 网易2016研发工程师编程题--完全解析

热门文章

  1. Word | 添加图题/图注、插入题注、设置插入题注快捷键...
  2. XS9951 两通道多合一同轴高清解码芯片 国产
  3. java开发聚合支付系统源码可支撑百万级并发
  4. 《望洞庭湖赠张丞相》 孟浩然
  5. 方便的支付宝第三方平台,三分钟教你搭建
  6. 怎样写好一篇英文论文
  7. 大厂的激励,员工们不买账了
  8. PMP笔记-项目管理过程中的审计类型
  9. 利用python做中文词频分析
  10. 【科研】经典演讲“You and Your Research”