资源下载地址:https://download.csdn.net/download/sheziqiong/85883662
资源下载地址:https://download.csdn.net/download/sheziqiong/85883662

算法实现设计说明

题目

给定一个有向图,完成:

  1. 建立并显示出它的邻接链表;
  2. 对该图进行拓扑排序,显示拓扑排序的结果,并随时显示入度域 的变化情况;
  3. 给出它的关键路径(要求:显示出Ve,Vl,E,L,L-E的结果)。

软件功能

首先,软件的首要功能就是接受一个有向图的输入,之后才能进行邻接链表的显示以及拓扑排序与关键路径显示等功能。

如图所示,该程序可以通过先输入节点,再输入边的形式输入一个有向图。

之后,可以将邻接链表以动画的形式显示出来,大概的实现方法是对邻接链表进行遍历,并且将相应的节点与边的信息储存到图形显示配置项[1]当中,进行显示。

其次,该程序可以根据给出的邻接链表进行拓扑排序,并且能够以动画的形式将拓扑排序的过程显示出来。具体的实现方法就是在进行拓扑排序的同时将每一轮的排序结果都加载到动画显示配置项中,之后进行显示,而每一轮排序中间则是设置了延迟,确保能够出现动画效果,动画的延迟可以由外部输入决定。



最后,该程序还能够显示输入图的关键路径,并且显示各顶点的 Ve,Vl 以及各个边(活动)的 L 和 E 的值。具体的实现方法也是对输入得到的邻接矩阵实现关键路径算法,计算出各个顶点的最早开始时间以及最晚开始时间,进而计算出各个边上的最早和最晚开始时间,并且计算出关键路径,并且将相关的信息存储到图像显示的配置项当中,从而完成对关键路径的显示。

设计思想

整个算法实现题的其实按照题目的顺序来就是一个比较完整的实现思路。

首先是读取邻接链表,根据给定的节点信息确定节点的数量以及名称,开辟存储空间。之后读取边的信息,对于给定的每一条边,找到它的源点,在其后的链式结构中添加相应的汇点以及边权,完成邻接链表的构建。

拓扑排序的过程,首先是创建存储各个节点入度的数组,并将其入度都初始化为 0。之后遍历整个邻接表,对于每条边上出现的汇点,都相应的将其入度+1,得到每个节点的入度情况。遍历入度表,找到所有入度为 0 的节点,将节点名称加入栈中。

由于拓扑排序每次都会将一个节点从原图中剔除,所以对其进行完整的拓扑排序的次数一定是固定的,等于图中节点的个数。在第一次进行拓扑排序时,栈中应该是有初始入度为0的节点,之后弹出栈顶元素,然该元素所指的其他的节点的入度减一,并且监测入度改变,如果该节点入度变为了零,则将该节点也加入栈中,这样做保证了寻找其他的入度为 0 的点不会产生额外开销。之后每一次循环都重复此操作,即可完成整个拓扑排序的过程。其中,如果在进行某一次拓扑排序时,发现栈已空,在上一轮排序中没有产生出入度为 0 的节点,则说明该图无法产生有效的拓扑排序,则跳出循环,弹出错误显示框。[2]

在完成拓扑排序之后,需要实现的是关键路径算法。关键路径简单来说就是进行了一次正拓扑排序以及一次逆拓扑排序,在进行正拓扑排序的同时计算出各个顶点的最早发生时间,再通过逆拓扑排序计算出各个顶点的最晚发生时间。之后再遍历整张图,根据节点信息计算出每个边(活动的)最早发生时间以及最晚发生时间,并据此确定出该活动是否为关键活动,并且将计算出的信息都存入图形显示配置项中,进行显示。[3]

逻辑结构与物理结构

逻辑结构

在进行图存储时,采用的逻辑结构为图形结构,图为有向图,每个节点都可能有多个前驱节点和多个后继节点,是多对多的图形结构。

在进行拓扑排序中,利用了栈来存储所有的入度为 0 的节点,栈的开始节点与终端节点都是唯一的,每个节点有且只有一个前驱节点,有且仅有一个后继节点,属于线性结构。

在拓扑排序中存储各个节点的度关系,以及关键路径中存储各点以及各边的最早最晚发生时间时,则是使用了集合结构,各个节点之间并没有明确的逻辑关系,只是为了反映各个节点与其对应值的关系。

物理结构

对于邻接矩阵的存储来说,首先是利用了散列存储结构,形成了节点名称到所指向节点链的映射。之后某一结点所指向的所有节点则是利用了链式存储结构,方便了频繁的插入删除。

对于存储入度为 0 节点的栈来说,由于主要是会频繁产生插入和删除操作,并且我们只关心尾部的节点情况,因此利用链式存储结构实现。

对于存储节点与其度的对应关系以及节点与边和最早最晚发生时间的数据结构来说,由于我们只关心对应值的情况,因此是使用散列存储结构进行存储。[4]

开发平台

开发平台

Electron 8.0.3 GitHub 发布的跨平台桌面应用开发工具,支持 Web 技术开发桌面

应用,其本身是基于 C++ 开发的,GUI 核心来自于 Chrome,而 JavaScript 引擎使用 v8。[5]

第三方库

ECharts 一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari 等),底层依赖轻量级的矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。[6]

jQuery 一个快速、简洁的 JavaScript 框架。 jQuery 设封装 JavaScript 常用的功能代码,提供一种简便的 JavaScript 设计模式,优化 HTML 文档操作、事件处理、动画设计和Ajax 交互。[7]

软件的运行环境:Windows10

系统的运行结果分析说明

调试与开发过程:首先是对题目进行了仔细地阅读与思考,对于整个的算法流程以及数据结构设计有了一个大致的构想。之后便是搜索相关库与相关资料,进行开发。由于项目采用的是基于 Electron 进行开发,因此整个项目的开发过程实际上就是在进行前端开发。

调试工具则是利用 Electron 中集成的类似浏览器的调试控制台进行调试。

运行结果说明:首先可以打开程序可以看到输入界面,可以进行节点以及边的情况的输入。在程序打开之后是有默认的预置的值,当然也可以进行自行重新输入以及调整。

点击“邻接链表”按钮,可以显示输入图形的邻接链表:

点击“拓扑排序”按钮,可以显示对给定图的拓扑排序的动画

点击“关键路径”按钮之后,则会显示当前图的关键路径:




当进行错误输入时,进行邻接链表以及拓扑排序关键路径等操作时将会显示错误提示


当输入的图的情况不满足拓扑排序条件时,即构成了回环时,则会报错并且提示无法进行拓扑排序或者关键路径生成操作。

操作说明

在打开程序以后,会自动进入输入界面,可输入得内容主要有图中的节点个数、各个节点的编号、边的个数、各个边的情况以及拓扑排序动画的显示延迟。

各输入框的输入规则如下:

  1. 输入节点个数要求是一个阿拉伯数字。

  2. 输入的节点数量应当余输入的节点个数保持一致,输入节点过少可能引发错误,输入节点过多后续节点将不会被读取。各个节点编号之间用空格隔开,节点编号支持任意字符串,不仅限于数字。

  3. 输入的边的个数要求是一个阿拉伯数字。

  4. 输入边的信息时,每行输入一条边的信息,每条边的形式如下:u v w,u 表示源点的节点名称,v 表示汇点的节点名称,w 表示边的权重,三个数据之间需要用空格隔开。u v 需要都是在输入的节点名称中出现过的名称,边的数量需要和上面输入的数量相同。

输入完成后,即可点击相应按钮显示相应动画。



资源下载地址:https://download.csdn.net/download/sheziqiong/85883662
资源下载地址:https://download.csdn.net/download/sheziqiong/85883662

拓扑排序和关键路径的图形化显示相关推荐

  1. 数据结构-----图的拓扑排序和关键路径算法

    部分图片取自:http://www.cnblogs.com/navorse/articles/1893863.html 在介绍拓扑排序和关键路径之前,先引入AOE网络的概念: 该图为一个AOE网,顶点 ...

  2. 考研复习之数据结构笔记(十二)图(下)(图的应用,包含最小生成树、最短路径、拓扑排序、关键路径以及单元小结)

    目录 一.图的应用 1.1 最小生成树 (1)基本概念与问题引入 (2)Prim(普里姆)算法 (3)Kruskal(克鲁斯卡尔)算法 1.2 最短路径 (1)基本概念与问题引入 (2)Dijkstr ...

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

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

  4. 拓扑排序和关键路径课程设计

    目录 1.    设计任务书... 3 1.1设计任务... 3 1.2程序功能... 3 1.3运行环境... 3 2.    本组课题... 3 2.1课题... 3 2.2本人任务... 3 3 ...

  5. python数据分析二一:图形化显示海地地震危机数据

    知识点回顾 zip() >>>a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>&g ...

  6. 超详细讲解实现拓扑排序、关键路径

    今天,小编带着大家来学习图中非常重要的一环,拓扑排序和关键路径! 目录 一. 绪论--实际应用 二. 拓扑排序 (一).含义 (二).实现原理 (三).代码实现 三. 关键路径 (一).含义 (二). ...

  7. 【逆向工具】IDA使用5-( string、图形化与视图的切换、图形化显示反汇编地址、自动注释、标签使用)...

    分析petya病毒时新学会的技巧. IDA技巧1 : string 提取文件中的字符串内容,如果看到一些文件字符串可以定位到关键的函数中. view -> open subview -> ...

  8. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

  9. jetson nano 远程登录及关闭图形化显示

    在nano上编译工程时总卡,最好用的解决方案就是远程登录并关闭图形化显示. 1.在另一台win上下载远程登录软件PuTTY,下载链接,提取码:ig0e 2.在nano上用ifconfig命令查看IP地 ...

最新文章

  1. python学习------tab补全
  2. 【每周NLP论文推荐】 掌握实体关系抽取必读的文章
  3. go mysql 查询数据_MySQL常用语句之查询数据-Go语言中文社区
  4. UCloud想吃科创板的“第一个螃蟹”
  5. 【转】介绍设置Session失效的几种方法
  6. java非阻塞锁_Java并发问题的非阻塞解决方案
  7. 架构设计:负载均衡层设计方案(1)——负载场景和解决方式
  8. C语言之链表探究之单向链表(List)、附双向循环链表参考博文地址
  9. Feature flag,一个让软件发布轻松不掉发的神技
  10. 小米刷机降级(自测红米note5)
  11. 人工智能系统Google开源的TensorFlow官方文档中文版
  12. 火星上网不是梦,国际空间站开测星际互联网DTN服务
  13. 脑电EEG代码开源分享 【2.预处理-静息态篇】
  14. 嵌入式环境搭建之zmodem
  15. 基于卷积神经网络的人脸识别
  16. Excel函数公式大全—VLOOKUP函数
  17. aspnetcore vue 下载zip文件,压缩包打不开的问题记录
  18. Spectral Algorithm
  19. 经典智力题:火车运煤
  20. python计算线性回归方程

热门文章

  1. 关于医院检验科仪器对LIS条码识别率偏低的原因调查
  2. oracle 表的碎片化整理
  3. PN6005电动车控制器芯片DC-DC降压芯片
  4. 92年出生的大龄程序员
  5. 英语学习的六大黄金原则
  6. 批量加密pdf方法(完全免费)
  7. SSL和SSH协议简单介绍。
  8. MT6575芯片原理图MT6575 datasheet资料
  9. 5G给视频监控带来了什么?
  10. 解决企业邮箱发邮箱数量上限问题