python --图(树)的存储

在蓝桥杯竞赛中,常见的图存储方式包括邻接矩阵、邻接表、链式前向星等。这些存储方式在不同的场景下有着各自的优势和适用性。

邻接矩阵

邻接矩阵是最常见的图的表示方法之一。对于一个有$n$个顶点的图,可以用一个$n \times n$的二维数组来表示。如果图中存在从顶点$i$到顶点$j$的边,则$adj[i][j]$为1,否则为0。邻接矩阵适用于稠密图,但在稀疏图中会占用较多的空间。

例题: 判断图中是否存在从顶点1到顶点3的边。

# 定义邻接矩阵
adj_matrix = [[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, 0, 1],[0, 0, 0, 0]
]if adj_matrix[1][3] == 1:print("顶点1到顶点3存在边")
else:print("顶点1到顶点3不存在边")

加边

def add_edge(adj_matrix, u, v):adj_matrix[u][v] = 1adj_matrix[v][u] = 1  # 如果是有向图则不需要这行

邻接表

邻接表是一种更节省空间的表示方法,它用一个数组和若干个链表来表示图。数组的每个元素表示一个顶点,对应的链表存储了从该顶点出发的所有边。邻接表适用于稀疏图,空间复杂度较低。

例题: 判断图中是否存在从顶点1到顶点3的边。

# 定义邻接表
adj_list = {1: [2],2: [3],3: []
}if 3 in adj_list[1]:print("顶点1到顶点3存在边")
else:print("顶点1到顶点3不存在边")

加边:

def add_edge(adj_list, u, v):if u not in adj_list:adj_list[u] = []adj_list[u].append(v)# 如果是有向图,则不需要下面这行if v not in adj_list:adj_list[v] = []adj_list[v].append(u)

链式前向星

链式前向星是一种用于存储稀疏图的高效表示方法,它通过三个数组来表示图的结构:headnxtto。其中head[u]存储了顶点$u$的第一条边的编号,nxt[i]存储了编号为$i$的边的下一条边的编号,to[i]存储了编号为$i$的边的终点。

例题: 使用链式前向星存储图,并遍历顶点1的所有邻居。

class Edge:def __init__(self, to, weight):self.to = toself.weight = weightself.next = Nonedef add(u, v, weight):global cntcnt += 1nxt[cnt] = head[u]head[u] = cntto[cnt] = v# 初始化
n = 4
head = [-1] * n
nxt = [0] * n
to = [0] * n
cnt = -1# 添加边
add(1, 2, 5)
add(1, 3, 3)
add(2, 3, 2)
add(2, 4, 6)
add(3, 4, 7)# 遍历顶点1的所有邻居
i = head[1]
while i != -1:print("顶点1的邻居:", to[i])i = nxt[i]

关于链式前向星的详细讲解:(参考这篇博客链式前向星)

以下是对原文的Python讲解: 

以下是对原文的Python讲解:前向星是一种特殊的边集数组,我们按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了。用`len[i]`来记录所有以i为起点的边在数组中的存储长度。用`head[i]`记录以i为边集在数组中的第一个存储位置。举个例子:我们输入边的顺序为:

1 2
2 3
3 4
1 3
4 1
1 5
4 5

那么排完序后就得到:

编号: 1 2 3 4 5 6 7
起点u: 1 1 1 2 3 4 4
终点v: 2 3 5 3 4 1 5

得到:

head[1] = 1 len[1] = 3
head[2] = 4 len[2] = 1
head[3] = 5 len[3] = 1
head[4] = 6 len[4] = 2

但是利用前向星会有排序操作,如果用快排时间至少为O(nlog(n))。 如果用链式前向星,就可以避免排序。 我们建立边结构体为:


```python
class Edge:def __init__(self, to, w):self.next = Noneself.to = toself.w = w

初始化cnt = 0,这样,现在我们还是按照上面的图和输入来模拟一下:

# 初始化
cnt = 0
edge = [Edge(0, 0) for _ in range(7)]
head = [-1] * 6# 加边
add(1, 2, 0)
add(2, 3, 0)
add(3, 4, 0)
add(1, 3, 0)
add(4, 1, 0)
add(1, 5, 0)
add(4, 5, 0)

很明显,head[i]保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置。

这样在遍历时是倒着遍历的,也就是说与输入顺序是相反的,不过这样不影响结果的正确性。

比如以上图为例,以节点1为起点的边有3条,它们的编号分别是0, 3, 5,而head[1] = 5

我们在遍历以u节点为起始位置的所有边的时候是这样的:

u = 1
i = head[u]
while i != -1:print("起点为{}的边的终点是{},权重为{}".format(u, edge[i].to, edge[i].w))i = edge[i].next

这样就可以正确地遍历出以节点1为起始位置的所有边。

 以上是在Python中常见的图存储方式及其应用例题。在蓝桥杯竞赛中,图相关的题目往往涉及到图的存储、遍历、最短路径、最小生成树等基本算法和数据结构。掌握这些常见的图存储方式对于解决相关问题非常重要。

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

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

相关文章

【Java】—— 集合框架:List接口常用方法与List接口的实现类

目录 4. Collection子接口1:List 4.1 List接口特点 4.2 List接口方法 4.3 List接口主要实现类:ArrayList 4.4 List的实现类之二:LinkedList 4.5 List的实现类之三:Vector 4.6 练习 4. Collection子接口1:List …

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面: 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的,镜像图层都是只读层, 第二个是: 容器读写层, 容器启动后,docker会基于容器镜像的读层&…

【python实操】python小程序之随机抽签以及for循环计算0-x的和

引言 python小程序之随机抽签以及for循环计算0-x的和 文章目录 引言一、随机抽签1.1 题目1.2 代码1.3 代码解释 二、for循环计算0-x的和2.1 题目2.2 代码2.3 代码解释 三、思考3.1 随机抽签3.2 for循环计算0-x的和 一、随机抽签 1.1 题目 使用input输入五个同学的名字随机抽取…

C++(Qt)软件调试---内存调试器Dr.Memory(21)

C(Qt)软件调试—内存调试器Dr. Memory(21) 文章目录 C(Qt)软件调试---内存调试器Dr. Memory(21)[toc]1、概述🐜2、安装Dr.Memory🪲3、命令行使用Dr.Memory🦗4、Qt Creator集成使用Dr.Memory&…

主流HR软件对比,五大系统功能与成本一览

五款主流HR系统包括ZohoPeople、金蝶人力云、用友人力云、红海eHR和SAPSuccessFactors,各具特色。ZohoPeople功能丰富,金蝶人力云云端部署,用友人力云多模块集成,红海eHR定制化服务,SAPSuccessFactors全球化视野。企业…

vite中sass警告JS API过期

1.问题 在Vite创建项目中引入Sass弹出The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0 - vite中sass警告JS API过期 The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0警告提示表明你当前正在使用的 Dart Sass 版本中&#…

VisionTS:基于时间序列的图形构建高性能时间序列预测模型,利用图像信息进行时间序列预测

构建预训练时间序列模型时面临的主要挑战是什么?获取高质量、多样化的时间序列数据。目前构建基础预测模型主要有两种方法: 迁移学习LLM:通过针对时间序列任务定制的微调或分词策略,重新利用预训练的大型语言模型(LLM…

CertiK《Hack3d:2024年第三季度安全报告》(附报告全文链接)

CertiK《Hack3d:2024年第三季度Web3.0安全报告》现已发布,本次报告深入分析了2024年7月至9月的链上安全状况,本季度总损失金额为7.53亿美元,网络钓鱼和私钥泄露是本季度造成资产损失的主要原因。 ​ 关键数据 2024年第三季度&a…

用Python实现运筹学——Day 9: 线性规划的灵敏度分析

一、学习内容 1. 灵敏度分析的定义与作用 灵敏度分析(Sensitivity Analysis) 是在优化问题中,分析模型参数变化对最优解及目标函数值的影响。它帮助我们了解在线性规划模型中,当某些参数(如资源供应量、成本系数等&a…

【C语言】数组(下)

6、二维数组的创建 6.1二维数组的概念 通过数组(上)介绍,我们学习了一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时就是二维数组,以此类推,如果把二维…

Mysql 索引底层数据结构和算法

索引数据结构 索引(index)是帮助MySQL高效获取数据的一种有序数据结构。索引是存储到表空间中,当我们的 sql 中的where条件用到索引的时候,会在存储层就过滤出数据来,如果不走索引,则需要在server层过滤。 …

5分钟学会SPI

SPI 定义:SPI 是一种机制,允许用户在不修改现有代码的情况下扩展和替换特定服务的实现。它定义了一组接口(Service Interfaces)和一组实现(Service Providers),使得应用程序可以动态加载和使用…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷…

【数学建模国赛】2024年数学建模国赛B题思路分析

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 题目 第一问分析 第二问分析 问题三分析 第四问分析 总结: 第一次参加国赛,侥幸被推送国一参与评奖。在省赛区结…

计网问答大题(期末复习)

计网总结笔记 概述 互联网的 2 个重要基本特点:连通性,资源共享 从互联网的工作方式上看,可以划分为两大块: •边缘部分: 由所有连接在互联网上的主机组成,由用户直接使用,用来进行通信&…

Java 方法前面加 <T> 是做什么?泛型方法 原理、样例

在 Java 中&#xff0c;方法前面加上 <T> 表示该方法是一个泛型方法。泛型方法允许你在方法签名中指定一个或多个类型参数&#xff0c;从而使得该方法可以处理多种类型的对象。这增加了代码的灵活性和复用性。 一、基本语法 <T1, T2, ..., Tn> 返回类型 方法名(形…

pytorch搭建神经网络(手搓方法)

假如我们有一个数据集形状为(348,14)。即有348个记录&#xff0c;每个记录有14个特征值。 我们想要搭建一个如下的神经网络&#xff1a; import torch import numpy as np# 创建数据集: 每个样本有14个特征 x_train np.array([[0.5, -1.2, 0.3, 0.8, 1.0, -0.5, 2.3, 1.2, -0…

基于单片机汽车尾灯控制系统

**单片机设计介绍&#xff0c;基于单片机汽车尾灯控制系统设计 文章目录 前言概要设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、…

【Kubernetes】常见面试题汇总(五十一)

目录 114. K8S 集群服务访问失败&#xff08;情况一&#xff09;&#xff1f; 115. K8S 集群服务访问失败&#xff08;情况二&#xff09;&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff…

探索未来:hbmqtt,Python中的AI驱动MQTT

文章目录 **探索未来&#xff1a;hbmqtt&#xff0c;Python中的AI驱动MQTT**1. 背景介绍2. hbmqtt是什么&#xff1f;3. 安装hbmqtt4. 简单的库函数使用方法4.1 连接到MQTT服务器4.2 发布消息4.3 订阅主题4.4 接收消息4.5 断开连接 5. 应用场景示例5.1 智能家居控制5.2 环境监测…