数据结构与算法(九)图链式存储

news2025/1/19 8:14:22

邻接表

度:无向图的度:顶点与邻接点连接的边就做度。有向图的度:指向顶点的边叫做入度,由顶点指向其他邻接点的边叫做出度

顶点:存储自身顶点信息和指向下一个临界点的指针

邻接点:保存临接点的存储下标和下一个邻接点的指向指针

存储方式:单向链接

无向图存储

arr[] = {a, d, c, b}  0 1 2 3

一个节点可以能多个邻接点,该节点可通过索引进行选择下一个邻接点选择哪个,如下图:

头表和邻接表

由上图可知,A有三个邻接点,分别是B C D。B有两个邻接点,分别是A C

在需要时,A可以直接指向C或D

有向图存储

有向图中,每一条边都有方向指向,分为出边和入边

在邻接表存储中只有出边没有入边

如上,只有A到E的边,没有E到A的边

带权图,只需同上加一个 权值表即可

在实际存储过程中,顶点和邻接点常以两种形式存储

邻接点:

struct AjdNode

{

    int index; 下标

    struct AdjNode* next; 指向下一个同类型的指针

}

顶点:

struct Node

{

    int data; 任意类型的数据域

    struct AjdNode* first;  指向第一个邻接点结构的指针

}

邻接表代码实现

const int g_maxcount = 1000;  定义一个最大节点数

int g_edge;

int g_nCount;

typedef struct _Node  按常理应有顶点和邻接点结构体,但此处省略写,两者共用一个结构体

{

    int nIndex;  既是邻接点下标也是data

    struct _Node * next;

}Node;

Node* head[g_nMaxCount]; 

声明一个数组,head相当于顶点,[]中相当于下标指向某一个顶点

void Create() 创建

{

    std::cout << "Input Node Count And Edge:" ;

    char cStart;  

    char cEnd; 边的两头,两个节点的字符

    std::cin >> g_nCount >> g_Edge; 输入要有多少个节点多少个边

    for(size_t i = 0; i < g_nEdge; i++)

    {

        std::cin >> cStart >> cEnd; 输入边的两头 如边ab ac

        int headIndex = cStart - 'a'; 转成数字编号,头节点的下标

        int nEdgeIndex = cEnd - 'a'; 尾节点的下标 input a - a = 0, b - a = 1 ,ASCII码应用

        Node* newNode = new Node; 进行插入

        newNode->nIndex = nEdgeIndex; 

        比如head是a edge是b,输入ab,a是顶点,b是邻接点,以邻接点b即b-a的数值当作下标从a指向b,具体理解如下

        newNode->next = head[nheadIndex];头插法,将新节点向下的指针,指向原有的第一个邻接点

        head[nheadIndex] = newNode;

    }

}

void print() 输出

{

    for(size_t i = 0; i < g_nCount; i++) 判断有多少个头

    {

        for(Node* temp = head[i]; temp != NULL; temp = temp->next) 遍历所有的头的邻接点

        临时节点指向头节点

        {

            std::out << "[" <<temp->nIndex << "]\t";

        }

        std::cout << std::endl;

    }

}

链式前向星

链式前向星由边集数组和头顶点数组组成,优点是可以快速访问一个点所有邻接点

边集数组 egde[i]  存储边

#define max 100

struct node  边集数组结构

{

    int to; 结尾的点

    struct node * next;

    int weight; 权值

}edge[max]; 定义有100个结构体

如下一个无向图

头节点数组

head[i] 存储下标 指向的第一个edge的下标

该图存储各个顶点信息 -1表示该顶点没有连向任何一个节点

边集数组便是将上述两个图结合起来,具体如下

最左边一列表示以哪个节点作为顶点

head表示该顶点指向的第一个边,如上图第一行head为2表示A指向了第2个边即edge[2]

上图中存储了各个边的信息 如第一条边存储了AB边,B是1,to是1

如上图边集数组A指向C之后A指向B,则在上图AC边next指向AB边

链式前向星代码实现

const int g_MaxCount = 100;

int g_nCount;  节点

int g_nEdge;  边

int g_nIndex;  索引

int g_nTo;  尾节点

int g_nWeight; 权值

int g_nHead; 顶点

int head[g_MaxCount]; 

struct Edge 边集数组

{

    int to;

    int weight;

    int next;

}e[g_MaxCount];

void init()

{

    memset(head, -1, (sizeof(int) * g_MaxCount));

    g_nHead = 0;

}

void add(int index; int to; int weight)

{

    e[g_nHead].to = to;

    e[g_nHead].weight = weight;

    e[g_Head].next = head[index];

    head[index] = g_nHead++; 

}

void print()

{

    for(size_t i = 1; i <= g_nCount; i++)

    {

        std::cout << i << ":\t";

        for(size_t j = head[i]; ~j; j = e[j].next) 遍历头数组 ~j相当于j != -1

        {

            std::cout << "[" << e[i].to << e[i].weight << "]\t";

        }

        std::cout << std::endl;

    }

}

应用:

std::cin >> g_nCount >> g_nEdge;

init();

for(size_t i = 1; i <= g_nEdge; i++)

{

    std::cin >> g_nIndex >> g_nTo >> g_nWeight;

    add(g_nIndex, g_nTo, g_nWeigh);

    add(g_nTo, g_nIndex, g_nWeigh);

}

print();

应用结果如下图

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

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

相关文章

关于Flutter中Image的BoxFit属性介绍

BoxFit 是一个枚举类型&#xff0c;用于指定如何调整图像以适应其显示容器。它通常用于 Image 或 DecorationImage 等涉及图像的部件和类中。 BoxFit的常用值介绍&#xff1a; Image中不加fit属性时图片状态 ↓ 蓝色框为图片所在容器 添加fit属性时图片的状态 ↓ 1.fill: 完全…

AQS原来是这么设计的,泰裤辣!

缘起 每门编程语言基本都离不开并发问题&#xff0c;Java亦如此。谈到Java的并发就离不开Doug lea老爷子贡献的juc包&#xff0c;而AQS又是juc里面的佼佼者 因此今天就一起来聊聊AQS 概念 AQS是什么&#xff0c;这里借用官方的话 Provides a framework for implementing blo…

【Linux】常用的基本命令指令②

前言&#xff1a;前面我们学习了Linux的部分指令&#xff0c;今天我们将接着上次的部分继续将Linux剩余的基本指令. &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的学习 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的学习日记…

了解Service Mesh:构建微服务的下一代架构

1. 引言 服务网格&#xff08;Service Mesh&#xff09;作为构建下一代微服务架构的关键技术&#xff0c;能够显著地简化和改善微服务架构的管理和运维&#xff0c;并提供了更高的可靠性、安全性和可观察性。今天就和大家一起了解下什么是Service Mesh&#xff0c;它能够做什么…

bootstrap5实现的高端蔬菜食品网页Obrien

一、需求分析 蔬菜超市在线系统是指一个基于互联网的平台&#xff0c;使消费者可以通过网络购买蔬菜和其他相关农产品。它提供了一种便捷的购物方式&#xff0c;消费者可以通过在线浏览商品、选择购买、支付和配送等步骤来完成购物过程。以下是蔬菜超市在线系统的一些功能&…

K-最近邻算法(KNN)是什么算法?

K-最近邻算法&#xff08;K-Nearest Neighbor&#xff0c;KNN&#xff09;是一种经典的有监督学习方法&#xff0c;也可以被归为懒惰学习&#xff08;Lazy Learning&#xff09;方法。它基于“物以类聚”的原理&#xff0c;假设样本之间的类别距离越近则它们越有可能是同一类别…

MT9284-28J 高效率升压白光LED驱动器IC SOT23-6 航天民芯

描述 MT9284是一个升压转换器&#xff0c;设计用于从单电池锂离子电池中驱动多达7个系列的白色led。MT9284使用电流模式&#xff0c;固定频率结构来调节LED电流&#xff0c;它通过外部电流感应电阻来测量。MT9284包括低电压锁定、限流和热过载保护&#xff0c;以防止在输出过载…

【MIT 6.S081】2020, 实验记录(1),Lab: Xv6 and Unix utilities

目录 实验准备TasksTask 1: Boot xv6Task 2: sleepTask 3: pingpongTask 4: primesTask 5: find 实验准备 这个 lab 用来学习尝试如何通过 system call 来实现常见的 shell 命令行程序&#xff0c;比如 ls、sleep、xargs 等。 实验官网 可以使用 docker 搭建实验环境&#x…

全志R128 SDK架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&…

MathType2024MAC苹果电脑版本下载安装图文教程

在数学和科学的世界里&#xff0c;表达精确的方程式和化学公式是至关重要的。MathType作为一款及其优秀且有全球影响力的数学公式编辑器&#xff0c;让这一切变得触手可及。MathType Mac版已全新升级&#xff0c;作为Microsoft Word和PowerPoint的Add-In插件&#xff0c;为您的…

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样&#xff0c;基于web页面实现任务调度配置与记录&#xff0c;使用简单&#xff0c;上手快速&#xff0c;其主要功能特性如下&#xff1a; 使用简单&…

CEC2017(Python):七种算法(PSO、RFO、DBO、HHO、SSA、DE、GWO)求解CEC2017

一、7种算法简介 1、粒子群优化算法PSO 2、红狐优化算法RFO 3、蜣螂优化算法DBO 4、哈里斯鹰优化算法HHO 5、麻雀搜索算法SSA 6、差分进化算法DE 7、灰狼优化算法GWO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., &am…

华为云Stack 8.X流量模型分析(六)

八、基础云专线流量模型分析 ​ 华为官方对云专线定义是&#xff1a;用户数据中心通过运营商的物理专线&#xff08;MPLS/VPN&#xff0c;以太专线&#xff09;访问云内资源&#xff0c;云内资源呈现真实IP&#xff0c;通过设置的专线路由实现三层互通。 ​ 通过云专线直接访…

LeetCode(36)有效的数独 ⭐⭐

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

ssm基于web的网络游戏交易平台信息管理系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装网络游戏交易平台软件来发挥其高效地信息处理的作用&#x…

SecOC中新鲜度值和MAC都按照完整的值来生成,但是在发送和认证的时候只会截取一部分。这边截取的部分一般取多长?由什么参数设定?

新鲜度值(Freshness Value, FV)和消息验证码(Message Authentication Code, MAC)是SecOC协议中用于保证数据的真实性和新鲜度的重要信息。它们的长度取决于不同的因素,如加密算法、安全级别、通信带宽等。 一般来说,FV和MAC的长度越长,安全性越高,但也会占用更多的通信…

Kibana 自定义索引连接器告警

一、 创建索引 PUT ipu-cbs-warning-info{"settings" : {"number_of_shards" : 1},"mappings" : {"properties" : {"timestamp": {"type": "date"},"rule_id" : { "type" : "…

面试官:CSS3新增了哪些新特性?

面试官&#xff1a;CSS3新增了哪些新特性&#xff1f; 一、是什么 css&#xff0c;即层叠样式表&#xff08;Cascading Style Sheets&#xff09;的简称&#xff0c;是一种标记语言&#xff0c;由浏览器解释执行用来使页面变得更美观 css3是css的最新标准&#xff0c;是向后兼…

十、基本对话框大集合(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 Qt提供了很多标准的对话框。例如标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框 (QFontDialog)、标准输入对话框 (QInputDialog) 及消息对话框 (QMessageBox)。本文展示各…

编写.NET的Dockerfile文件构建镜像

创建一个WebApi项目&#xff0c;并且创建一个Dockerfile空文件&#xff0c;添加以下代码&#xff0c;7.0代表的你项目使用的SDK的版本&#xff0c;构建的时候也需要选择好指定的镜像tag FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443F…