算法-图的存储,图的转置,拓扑排序

1.图的存储
图用来对关系建模.图是节点和边构成的集合.节点反映图的元素集合,边反映图的元素集合中元素间的关系.
在这里插入图片描述
上述是由五个节点,三条边构成的结构.我们可以用图对其建模.

对由节点,边构成的集合采用图结构表示时候,我们可以有两种基本选择,这两种基本选择引出图结构两种基本存储方式:邻接表存储,矩阵存储.

(1). 邻接表存储
我们依次存储图中每个节点,对节点间关系采用邻接表方式.
针对上述实例,具体为:

#include <stdio.h>
#include <stdlib.h>
template<class EdgeInfo>
class AdjNode{
public:AdjNode* m_pNext = nullptr;EdgeInfo m_stInfo;int m_nId;
};
template<class T, class EdgeInfo>
class Node{
public:T m_stEle;AdjNode<EdgeInfo>* m_pList = nullptr;
};
int main(){Node<int, int> stNodes[5];AdjNode<int> stAdjNode[3];stAdjNode[0].m_nId = 2;stAdjNode[0].m_stInfo = 11;stAdjNode[1].m_nId = 1;stAdjNode[1].m_stInfo = 14;stAdjNode[2].m_nId = 1;stAdjNode[2].m_stInfo = 12;stNodes[0].m_pList = &stAdjNode[0];stNodes[3].m_pList = &stAdjNode[1];stNodes[4].m_pList = &stAdjNode[2];
}

这种表示方法下,通过节点可以找到以该节点为起点的所有边的信息.
(2). 矩阵存储
我们依次存储图中每个节点,对节点间关系采用矩阵方式存储.
针对上述实例,具体为:

#include <stdio.h>
#include <stdlib.h>
template<class T>
class Node{
public:T m_nEle;
};
template<class EdgeInfo>
class Edge{
public:bool m_bValid = false;EdgeInfo m_stInfo;
};
int main(){Node<int> stNodes[5];Edge<int> stEdges[5][5];stEdges[0][2].m_bValid = true;stEdges[0][2].m_stInfo = 11;stEdges[4][1].m_bValid = true;stEdges[4][1].m_stInfo = 12;stEdges[3][1].m_bValid = true;stEdges[3][1].m_stInfo = 14;
}

这种表示方法下,通过矩阵来存储所有边的信息.

(3). 总结
当图的边的数量较少时,采用邻接表方式,比较节省空间.
当图的边的数量较多时,采用矩阵方式,有助于快速定位边的信息和存在性.

2.图的转置
即逆转图中的关系.
针对上述实例,转置处理后示意图如下:
在这里插入图片描述
3.拓扑排序
(1). 定义
拓扑排序是对一个有向无环图的顶点进行排序的过程。这个排序的目的是将图中的所有顶点排成一个线性序列,使得对于图中的任意一对顶点uv,如果存在一条从uv的边,那么u在线性序列中的位置就出现在v之前。这样的线性序列被称为满足拓扑次序的序列,简称拓扑序列。

拓扑排序在计算机科学和图论中具有重要的应用。它常被用来确定一个依赖关系集中,事物发生的顺序。例如,在一个工程项目中,各个子工程(或任务)之间可能存在一定的依赖关系,即一个子工程必须在另一个子工程完成后才能开始。通过拓扑排序,我们可以得到一个合理的子工程执行顺序,从而确保项目能够顺利进行。
(2). 实例
拓扑排序的一个实例可以是一个课程安排的场景。假设我们有一个学校的课程安排,其中一些课程是其他课程的前置课程,也就是说,在修读某些课程之前,必须先完成其他特定的课程。我们可以将这些课程看作有向无环图中的顶点,而将前置课程关系看作图中的有向边。

例如,假设我们有以下课程及其前置课程关系:
课程A是课程B的前置课程.
课程B是课程C和课程D的前置课程.
课程C是课程E的前置课程.
这可以表示为以下的有向无环图:
在这里插入图片描述
现在,我们想要对这些课程进行拓扑排序,以确定一个学生可以按照该顺序完成所有课程的合理学习路径。使用拓扑排序算法,我们可以得到以下的一个可能的拓扑序列:A -> B -> C -> D -> E
(3). 算法实现
a. 创建一个队列,并将所有入度为0的顶点加入队列,一个存储拓扑排序结果的集合。
b. 当队列非空时,循环执行以下步骤:
b.1. 从队列中取出一个顶点。
b.2. 将其添加到结果集合尾部。
c.2. 对于该顶点的所有邻接顶点,将其入度减1。如果入度变为0,则将该邻接顶点加入队列。
c. 如果图中还有顶点未被输出,则图中存在环,无法进行拓扑排序.否则,算法结束.

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

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

相关文章

选型|匠芯创工业级显示控制MCU

D13x系列微控制器 匠芯创D13x系列是一款基于RISC-V架构的高性能、国产自主、工业级跨界MCU&#xff0c;配备强大的2D图形加速、PNG解码、JPEG编解码引擎&#xff0c;具有丰富的屏接口&#xff0c;具有工业宽温、高可靠性、高开放性&#xff0c;可广泛应用于工业HMI、网关、串口…

武装部数字孪生三维电子沙盘系统研究与实现

深圳易图讯科技有限公司研发的(www.3dgis.top)武装部数字孪生三维电子沙盘系统是一种集成了先进信息技术和军事理论的创新系统&#xff0c;旨在通过三维可视化技术&#xff0c;实现战场环境的精确模拟和作战方案的快速生成。该系统利用三维建模技术&#xff0c;构建高度逼真的战…

C#进程说

C#中的进程可以通过System.Diagnostics命名空间下的Process类来控制和管理。可以通过以下步骤来创建和启动一个进程&#xff1a; 1. 引入System.Diagnostics命名空间。 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using…

【相关问题解答2】bert中文文本摘要代码:结果输出为一些重复的标点符号和数字

【相关问题解答2】bert中文文本摘要代码 写在最前面问题1&#xff1a;tokenizer.py中encode函数&#xff0c;不能使用lower操作关于提问问题描述1一些建议1问题更新2&#xff1a;结果输出为一些重复的标点符号和数字一些建议21. 数据检查和预处理2. 模型和训练配置3. 过拟合和欠…

【问题总结】重写equalshashCode时需要的问题和避坑经验总结

知识点回顾 开发Java都知道&#xff0c;我们在使用POJO对象存储信息时&#xff0c;一定要重写 equals 方法和hashCode 方法 前者是为了解决当两个POJO对象执行equals时&#xff0c;对比具体数值信息&#xff0c;而不是直接对比对象本身。后者是为了解决因为在使用散列数据结构…

【Flutter 面试题】怎么理解Flutter的Isolate?并发编程

【Flutter 面试题】怎么理解Flutter的Isolate&#xff1f;并发编程 文章目录 写在前面解答补充说明完整代码示例说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;…

数据库系统概念(第二周 第一堂)

前言 本文的所有知识点、图片均来自《数据库系统概念》&#xff08;黑宝书&#xff09;、山东大学李晖老师PPT。不可用于商业用途转发。 回顾 上周最后一个知识点说到数据库三级模式结构&#xff0c;在这个结构里面我们设立了模式/内模式映像、内模式/外模式映像&#xff0c;主…

罐头鱼AI短视频矩阵获客|AI视频批量生成

罐头鱼AI传单功能操作说明&#xff0c;智能化提升您的视频营销效率&#xff01; 在这个信息爆炸的时代&#xff0c;短视频已成为企业营销的重要方式之一。而为了更高效地进行视频营销&#xff0c;罐头鱼AI传单功能应运而生&#xff0c;为您提供全方位的视频管理和发布服务。 首…

3d模型渲染成线条怎么办?---模大狮模型网

将3D模型渲染成线条效果通常可以通过以下几种方法实现&#xff0c;具体取决于你使用的建模软件或渲染器&#xff1a; 使用渲染器的线条渲染功能&#xff1a; 许多渲染器(如Blender的Cycles渲染器、Maya的Arnold渲染器等)提供了线条渲染功能。通过在渲染器设置中启用线条渲染选…

生产环境是Linux,日志不好查?自己开发一个下载日志功能页面

有时候甲方爸爸的项目要部署内网,日志不能直接copy&#xff0c;还是linux系统。排查日志很不方便。 自己搞一个日志下载功能&#xff0c;如果是分布式的项目&#xff0c;还能把其他项目的日志也一起copy下来&#xff0c;来看。 public BiStateDTO<Object> logList(Requ…

MAE预训练的VIT

MAE预训练的VIT&#xff0c;参考这篇文章&#xff1a;Segment Anything论文和源码解读 - 知乎

UI 学习 二 可访问性 模式

一 颜色对比 颜色和对比度可以用来帮助用户看到和理解应用程序的内容&#xff0c;与正确的元素交互&#xff0c;并理解操作。 颜色可以帮助传达情绪、语气和关键信息。可以选择主色、辅助色和强调色来支持可用性。元素之间足够的颜色对比可以帮助低视力的用户看到和使用你的应…