图的拓补排序(TopologicalSort)算法在邻接表与邻接矩阵结构下实现
如题 自用笔记 如有错误欢迎及时指正
拓补排序需要知道每个顶点的入度情况 求出度入度的方法以及所用数据结构定义见下文
两种存储结构下求有向图顶点出度与入度_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)算法在邻接表与邻接矩阵结构下实现相关推荐
- 士兵排队问题(拓补排序)(附简要拓补排序思想及算法)
题目描述 有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道"1 比2 高,7 比 5高"这样的 ...
- 每日一题30:拓补排序
问题描述 所谓拓补排序就是确定图中节点的一种顺序,使得某些在别的节点访问之前不能访问到的节点排在后面.所以该算法的核心是每一步选择一个没有入度的节点,因为没有入度意味着该节点没有前驱,得到一个节点后, ...
- 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率
[BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...
- leetcode *210. 课程表 II(拓补排序)(2020.5.17)
[题目]*210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们 ...
- 51nod-生产口罩(拓补排序+DP)by zyz
题目:生产口罩 链接:http://class.51nod.com/Classes/Problem.html#courseProblemId=1718&classId=129 //注:题目来自 ...
- 奖金(拓补排序的应用)
谁应该高谁的入度++,并记录下谁比低的高(低的得出度),所以入度为零的就是最低的(好不公平),找出所有最低的,将他们算作一层,奖金++(算是拓补排序吧) #include<cstdio> ...
- HDU4324 - Triangle LOVE 拓补排序
HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include < ...
- Aov网络与拓补排序的实现
测试的节点分布如下: 测试代码如下: /** 拓补排序的实现,使用邻接链表存储有向图 */ #include <iostream> #include <cstdio> #inc ...
- 后缀自动机求多个串的最长公共子串+拓补排序讲解+LCS2 - Longest Common Substring II
网上所有关于后缀自动机拓补排序的文章,都默认读者会拓补排序,简直了. 后缀自动机的拓补排序,就是按照长度进行排序,在进行特定操作的时候,通过较长的后缀来更新较短的后缀.那么也就是通过拓补排序中排名靠后 ...
- 【数据结构】邻接表的储存结构 建立图的邻接表算法
[数据结构]邻接矩阵及其实现 一个图的邻接矩阵的表示是唯一的,但其邻接表表示不唯一,这是因为在邻接表结构中,各便表结点的链接次序取决于建立邻接表时的算法以及输入的次序. 一般而言邻接矩阵适合存储稠密图 ...
最新文章
- 我不喜欢Go语言的十个理由
- 如果宁静是 Oracle,万茜、张雨绮、黄圣依是什么?
- sqoop 数据迁移
- resultset需要关闭吗_微信视频号能关闭吗?怎么操作?3秒教你搞定
- 论文共读 | “阳奉阴违”的半监督学习算法 - Virtual Adversarial Training
- AIR 中 File 对象的几个系统文件夹及其属性.
- html缓慢下拉,html - 列表下拉导航-适用于除野生动物园之外的所有浏览器。 间隔开并缓慢 - 堆栈内存溢出...
- POJ 3690 找星座(2D匹配)(未解答)
- 为什么CAP不能同时满足的简单理解
- 三星计划在第二代GalaxyFold上采用屏下摄像头技术
- 《中国人工智能学会通讯》——5.4 结 论
- 读懂现金贷产品的客群风险标签维度
- jq使用教程02_安装的问题
- 【SQL】substr截取结果和想象中有差异?
- fatal error C1853: 'Debug/***.pch' is not a precompiled header file created with this compil
- android wear表盘商店,手里的 Android Wear 太没个性?你该试试这 4 款表盘
- aria2 32bit Android,【各版本整合】32/64位Aria2 Tools - 支持RPC协议 AriaNG(客户端+网页版)...
- 分析在智能语音对话流程
- 哪款分体式蓝牙耳机体验最好?便宜好用的分体式蓝牙耳机!
- 网易2016研发工程师编程题--完全解析