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

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.mzph.cn/news/744302.shtml

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

相关文章

大数据开发(Kafka面试真题-卷三)

大数据开发&#xff08;Kafka面试真题&#xff09; 1、Kafka是如何进行数据备份的&#xff1f;2、Kafka里面存的数据格式是什么样的&#xff1f;3、Kafka是如何清理过期文件的&#xff1f;4、Kafka的一条message中包含了哪些信息&#xff1f;5、Kafka中的数据能彻底删除吗&…

【Python】Leetcode 240. 搜索二维矩阵 II - 削减矩阵+递归,击败88%

描述 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。 该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路 确定左右及上下限&#xff0c;削减矩阵&#xff0c;递归。 注意判断四个端…

Python 面向对象

在 Python 中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种程序设计范例&#xff0c;它以对象为基础&#xff0c;将数据和操作封装在对象内部&#xff0c;通过定义类和创建对象来实现。让我们来介绍 Python 中面向对象编…

【Git】统计所有仓库单个用户的代码提交量

将以下代码保存为 gitStatics.sh,并且放置在存放所有仓库的文件夹内,与仓库文件保持同级。 #!/bin/bash # 检查是否提供了足够的参数 if [ "$#" -ne 1 ]; then echo "Usage: $0 <username>" exit 1 fi # 获取用户名参数 user

API数据能力开放架构 数据api接口

一.API数据接口可以从几个不同的角度来看待&#xff1a; 1. 技术角度&#xff1a;API数据接口是一种技术实现&#xff0c;通常是以HTTP协议或其他网络协议为基础&#xff0c;并采用特定的数据格式&#xff08;如JSON或XML&#xff09;来传递数据。 2. 业务角度&#xff1a;API…

视口坐标转换成Canvas下本地坐标与shader显示在3D物体前

shader显示在3D物体前&#xff0c;先转化成视口坐标 public virtual void SetESignPos() { float x 0; float y 0; int v PlayerPrefsTool.GetSpecialScreen(-1); if (EScreenCamera ! null) { Vector3 viewPointEScreenCa…

前端input上传文件 使用new FormData()同时上传文件类型和JSON数据

失败案例 async uploadFileHandler(e) {if (e.target.files.length) {const files e.target.files[0];let formData new FormData();formData.append("file", files);formData.append("module", "knowledge");fileupload(formData).then(res …

JVM探究

JVM探究 请你谈谈你对JVM的理解&#xff1f;java -> class -> jvm java 8虚拟机和之前的变化更新OOM 内存溢出。栈溢出 StackOverFlowError > 怎么分析JVM的常用调优参数 &#xff1f; 扩大内存内存快照如何抓取&#xff0c;怎么分析Dump文件&#xff1f;知道吗&…

SAP 生产订单中计划成本问题简介

最近财务在月结的时候,发现有生产订单结算的时候有物料不存在计划成本,并且财务顾问反馈这个问题已经存在有一段时间了。通过对生产订单的成本分析按钮查看生产订单的成本 发现确实存在有物料不存在计划成本,但是生产订单存在实际成本。 1、首先想到的是无计划成本的原材料…

使用Python进行图片格式转化/分辨率转化

一.下载python PIY插件库 PIP下载命令: pip install pillow -i https://mirrors.aliyun.com/pypi/simple PIY插件库:pillow Installation - Pillow (PIL Fork) 10.3.0.dev0 documentation 二.分辨率转化 from PIL import Image import osresolution (1024, 1024) with Image…

redis监控

一、Redis监控方法 1、redis info命令 Redis的监控指标主要通过INFO命令获取&#xff0c;该命令可以返回丰富的运行监控信息。info主要有以下几项&#xff0c;因版本不同可能略有差别&#xff1a; # Server redis_version:7.2.4 redis_git_sha1:00000000 redis_git_dirty:0 …

C语言易错知识点:scanf函数

scanf在C语言学习中比较常用&#xff0c;但因为其涉及屏幕缓冲区导致有的时候会调入陷阱&#xff0c;下面分享一下常见的需要注意的事项&#xff1a; 1.输入末尾带有回车\n 当我们输入数据后&#xff0c;最后按下回车时&#xff0c;屏幕缓冲区的末尾都会含有这个字符 scanf的…

Web安全攻防措施

2024最新Web安全攻防教程资料PPT大合集&#xff08;143份&#xff09;.zip 输入验证和过滤&#xff1a;对用户输入进行严格的验证和过滤&#xff0c;以防止SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;等。例如&#xff0c;对特殊字符进行转义处理&#xff0c;限制输入…

代码书写在if __name__ == ‘__main__‘前后的区别

if __name__ __main__这个东西&#xff0c;所有见过python代码的程序猿们一定都不会陌生。为方便理解&#xff0c;有人直接把它等同于java中的主函数。我们今天不是为了来探讨它和Java主函数的异同的&#xff08;因为我已经忘了Java主函数的细节了&#xff0c;也懒得再回顾…&…

leetcode110.平衡二叉树

之前没有通过的样例 return语句只写了一个 return abs(l-r)<1缺少了 isBalanced(root->left)&&isBalanced(root->right);补上就好了 class Solution { public:bool isBalanced(TreeNode* root) {if(!root){return true;}int lgetHeight(root->left);i…

(学习日记)2024.03.11:UCOSIII第十三节:使用优先级的流程 (持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

vulntarget-k - 内网渗透

标签 xxl-job rce Spring-Cloud-CVE-2022-22947 nacos auth bypass iox 靶机难度比较简单&#xff0c;都是用用 exp 就好了 拓扑图 网卡设置 首先需要使用虚拟网络编辑器&#xff0c;增加 VMnet1、VMnet2、VMnet3 对三张网卡设置子网 IP VMnet1 192.168.100.0 VMnet2 1…

EM算法详解

EM(Expectation-Maximum)算法也称期望最大化算法,曾入选“数据挖掘十大算法”中,可见EM算法在机器学习、数据挖掘中的影响力。EM算法是最常见的隐变量估计方法,在机器学习中有极为广泛的用途,例如常被用来学习高斯混合模型(Gaussian mixture model,简称GMM)的参数;隐…

SIP-7043 20W SIP网络有源吸顶喇叭

SIP-7043 20W SIP网络有源吸顶喇叭 一、描述 18123651365微信 声卡喊话IP喇叭&#xff0c;IP网络吸顶天花喇叭 SIP-7043VP是我司的一款SIP网络有源吸顶喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭…

jpg格式图片怎么生成二维码?扫码看图在线制作方法

多张jpg格式的图片如何做成二维码展示&#xff1f;jpg是现在最常用的一种图片格式&#xff0c;不管是拍摄的照片、设计图片或是其他类型的图片基本上都是这种格式。那么如何将jpg格式的图片放到二维码中展示呢&#xff1f;通过下面的文章内容来分享一下图片制作二维码在线的技巧…