数据结构之拓扑排序

拓扑排序介绍

拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。

这样说,可能理解起来比较抽象。下面通过简单的例子进行说明!
例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的。

在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B出现在A的后面。

拓扑排序算法的基本步骤

  1. 构造一个队列Q(queue) 和 拓扑排序的结果队列T(topological);
  2. 把所有没有依赖顶点的节点放入Q;
  3. 当Q还有顶点的时候,执行下面步骤:
    3.1 从Q中取出一个顶点n(将n从Q中删掉),并放入T(将n加入到结果集中);
    3.2 对n每一个邻接点m(n是起点,m是终点);
    3.2.1 去掉边
#define MAX 100
// 邻接表
class ListDG
{private: // 内部类// 邻接表中表对应的链表的顶点class ENode{int ivex;           // 该边所指向的顶点的位置ENode *nextEdge;    // 指向下一条弧的指针friend class ListDG;};// 邻接表中表的顶点class VNode{char data;          // 顶点信息ENode *firstEdge;   // 指向第一条依附该顶点的弧friend class ListDG;};private: // 私有成员int mVexNum;             // 图的顶点的数目int mEdgNum;             // 图的边的数目VNode *mVexs;            // 图的顶点数组public:// 创建邻接表对应的图(自己输入)ListDG();// 创建邻接表对应的图(用已提供的数据)ListDG(char vexs[], int vlen, char edges[][2], int elen);~ListDG();// 深度优先搜索遍历图void DFS();// 广度优先搜索(类似于树的层次遍历)void BFS();// 打印邻接表图void print();// 拓扑排序int topologicalSort();private:// 读取一个输入字符char readChar();// 返回ch的位置int getPosition(char ch);// 深度优先搜索遍历图的递归实现void DFS(int i, int *visited);// 将node节点链接到list的最后void linkLast(ENode *list, ENode *node);
};

(01) ListDG是邻接表对应的结构体。 mVexNum是顶点数,mEdgNum是边数;mVexs则是保存顶点信息的一维数组。
(02) VNode是邻接表顶点对应的结构体。 data是顶点所包含的数据,而firstEdge是该顶点所包含链表的表头指针。
(03) ENode是邻接表顶点所包含的链表的节点对应的结构体。 ivex是该节点所对应的顶点在vexs中的索引,而nextEdge是指向下一个节点的。

拓扑排序

/** 拓扑排序** 返回值:*     -1 -- 失败(由于内存不足等原因导致)*      0 -- 成功排序,并输入结果*      1 -- 失败(该有向图是有环的)*/
int ListDG::topologicalSort()
{int i,j;int index = 0;int head = 0;           // 辅助队列的头int rear = 0;           // 辅助队列的尾int *queue;             // 辅组队列int *ins;               // 入度数组char *tops;             // 拓扑排序结果数组,记录每个节点的排序后的序号。ENode *node;ins   = new int[mVexNum];queue = new int[mVexNum];tops  = new char[mVexNum];memset(ins, 0, mVexNum*sizeof(int));memset(queue, 0, mVexNum*sizeof(int));memset(tops, 0, mVexNum*sizeof(char));// 统计每个顶点的入度数for(i = 0; i < mVexNum; i++){node = mVexs[i].firstEdge;while (node != NULL){ins[node->ivex]++;node = node->nextEdge;}}// 将所有入度为0的顶点入队列for(i = 0; i < mVexNum; i ++)if(ins[i] == 0)queue[rear++] = i;          // 入队列while (head != rear)                // 队列非空{j = queue[head++];              // 出队列。j是顶点的序号tops[index++] = mVexs[j].data;  // 将该顶点添加到tops中,tops是排序结果node = mVexs[j].firstEdge;      // 获取以该顶点为起点的出边队列// 将与"node"关联的节点的入度减1;// 若减1之后,该节点的入度为0;则将该节点添加到队列中。while(node != NULL){// 将节点(序号为node->ivex)的入度减1。ins[node->ivex]--;// 若节点的入度为0,则将其"入队列"if( ins[node->ivex] == 0)queue[rear++] = node->ivex;  // 入队列node = node->nextEdge;}}if(index != mVexNum){cout << "Graph has a cycle" << endl;delete queue;delete ins;delete tops;return 1;}// 打印拓扑排序结果cout << "== TopSort: ";for(i = 0; i < mVexNum; i ++)cout << tops[i] << " ";cout << endl;delete queue;delete ins;delete tops;return 0;
}

说明:
(01) queue的作用就是用来存储没有依赖顶点的顶点。它与前面所说的Q相对应。
(02) tops的作用就是用来存储排序结果。它与前面所说的T相对应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http://www.shengshiyouxi.com

android从Linux系统启动有4个步骤&#xff1b; (1) init进程启动 (2) Native服务启动 (3) System Server&#xff0c;Android服务启动 (4) Home启动 总体启动框架图如&#xff1a; 第一步&#xff1a;initial进程(system\core\init) init进程&…

清华 Aminer 发布最新2018人脸识别研究报告

来源&#xff1a;专知AMiner平台由清华大学计算机系研发&#xff0c;拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱&#xff0c;提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。 今日&#xff0c;该平台发布最新的201…

数据结构之字典序全排列

字典序法中&#xff0c;对于数字1、2、3……n的排列&#xff0c;不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345&#xff0c;排列12345在前&#xff0c;排列12354在后。按照这样的规定&#xff0c;5个数字的所有的排列中最…

敏捷实践:比每日会议更疯狂的半日会议!

由“每周例会”说起 每天项目例会的话&#xff0c;频率太高了&#xff0c;可能会浪费时间&#xff0c;如果每月一次&#xff0c;似乎时间太长了&#xff0c;于是我们往往会“每周例会”。 有一次我参加了某项目的每周例会&#xff0c;开会的时间是周五&#xff0c;会上其中一位…

智能生产的现状与未来!

来源&#xff1a;数字化企业北京机械工业自动化研究所首席专家蒋明炜先生是我国最早投身企业管理及其信息化事业的专家之一&#xff0c;积累了宝贵的理论实践经验&#xff0c;在国家提出《中国制造2025》之后&#xff0c;蒋明炜先生作为该领域资深专家&#xff0c;先后组织领导…

琐碎知识

在c/c中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff1a;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。堆&#xff1a;就是那…

82岁的北大教授证明了黎曼猜想?

来源&#xff1a;AI科技大本营最近&#xff0c;黎曼猜想有点热。上个月&#xff0c;89 岁的菲尔兹奖与阿贝尔奖双料得主、英国皇家学会院士迈克尔阿蒂亚爵士&#xff08;Michael Atiyah&#xff09;刚刚宣布自己证明了黎曼猜想。近日&#xff0c;82 岁的北大教授&#xff08;已…

Atlas机器人再秀逆天操作!波士顿动力科研or商业化,将何去何从?

来源&#xff1a;物联网智库在众多机器人相关的技术公司里&#xff0c;波士顿动力的核心特点在于&#xff0c;他们始终将「仿生」看作机器人设计的最高宗旨。其创始人Raibert 也称自己的目的是建造一种能和动物以及人一模一样的&#xff0c;完成一切事情的机器人。这既是波士顿…

OpenGL6-纹理动画

代码下载 #include "CELLWinApp.hpp"#include <gl/GLU.h>#include <assert.h>#include <math.h>#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")#pragma comment(lib,"winmm.lib") /*** 这个…

《科学美国人》:美国应保持太空、网络、生物领域的科技优势

来源&#xff1a;美国《科学美国人》转自&#xff1a;国防科技要闻&#xff08;ID&#xff1a;CDSTIC&#xff09;作者&#xff1a;军事科学院军事科学信息研究中心 吴海近日&#xff0c;美国《科学美国人》杂志发表《我们准备好迎接未来战争了吗&#xff1f;》一文&#xff…

hdu 4502 一维dp

吉哥系列故事——临时工计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2159 Accepted Submission(s): 807 Problem Description俗话说一分钱难倒英雄汉&#xff0c;高中几年下来&#xff0c;吉哥已经深…

微信开发入门

微信开发需要搭建PHP环境 参考链接&#xff1a;Apache2.2与php5.3.5如何整合&#xff1f;如何能够被使用_百度经验 搭建的过程出现了很多坑&#xff0c;只能小心&#xff0c;重复搭建了&#xff0c;错误原因可能是VC9或VC11环境没有配置的原因&#xff0c;多试试才行。 然后…

实现计算机界“大满贯”,芮勇博士再获技术成就大奖

来源&#xff1a;联想研究院近日&#xff0c;国际计算机协会&#xff08;ACM&#xff09;多媒体专委会&#xff08;Special Interest Group on Multimedia&#xff0c;简称SIGMM&#xff09;2018技术成就奖揭晓了。在全球众多的候选人当中&#xff0c;该奖最终花落联想集团首席…

PHP之MVC学习

代码架构进货过程 one&#xff0c;混编 嵌入式脚本语言PHP html与php混编的编码方式 two&#xff0c;显示和逻辑相分离 最后&#xff0c;需要将显示和逻辑的结果放在一起&#xff01; 需要在 php页面&#xff0c;将html代码 载入才可以&#xff01; <?php // 业务…

机器人流程自动化崛起,中国是否准备好迎接智能自动化时代?

来源&#xff1a;亿欧智库摘要&#xff1a;机器人流程自动化&#xff08;Robotic Process Automation, RPA&#xff09;正迅速成为企业改善服务、提高效率和降低成本的关键工具。对此&#xff0c;PWC针对国内RPA市场展开了调查&#xff0c;预计未来45%的工作活动可以实现自动化…

PHP之MVC项目实战

本文主要包括以下内容 类文件自动加载 路径管理 页面跳转 注册自动加载方法 配置文件系统 cookie session 类文件自动加载 在PHP中使用别的类时&#xff0c;需要载入类文件&#xff0c;如果类很多的话&#xff0c;需要重复写很多代码&#xff0c;所以利用__autoload魔法方法…

加州伯克利大学:自动驾驶中虚拟到现实的强化学习|厚势汽车

来源&#xff1a;同济智能汽车研究所UCB 提出了虚拟场景到真实场景的翻译网络&#xff0c;解决强化学习用于自动驾驶虚拟测试中与现实测试的差异。强化学习需要大量的试错&#xff0c;而真实的自动驾驶车辆&#xff08;AV&#xff09;无法提供大量的试错为此 AV 强化学习使用虚…

Effective C++ 第二版 1)const和inline 2)iostream

条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到ASPECT_R这个符号名, 在源码进入编译器之前, 就被预处理程序去掉, ASPECT_R 不会被加入到符号列表中; 编译报错时, 报错信息指向1.653, 让…

PHP之MVC项目实战(二)

本文主要包括以下内容 GD库图片操作 利用GD库实现验证码 文件上传 缩略图 水印 GD库图片操作 <?php$img imagecreatetruecolor(500, 300); //var_dumP($img); // //分配绿色 $green imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result ima…

2019年机器学习:追踪人工智能发展之路

作者&#xff5c;Hussain Fakhruddin编译&#xff5c;专知整理&#xff5c;Yingying&#xff0c;李大囧摘要&#xff1a;“智能助理”的时代已经到来了。机器学习已经成为全球数字化转型的关键要素之一 ,在企业领域&#xff0c;机器学习用例的增长在过去几年中也是显著的。预计…