PyCharm专项练习3 图的存储:邻接矩阵+邻接链表

ops/2024/12/27 16:39:19/

一、实验目的

        本文的实验目的是通过Python编程实践,实现对图的两种存储方式——邻接矩阵和邻接链表的掌握与应用。针对给定的有向图和无向图,通过编码实现这两种存储方式,并能够对图进行输出展示。

二、实验内容

  1. 图的存储方式实现
    • 使用邻接矩阵方式存储图:定义一个GraphMatrix类,包含图的顶点数和邻接矩阵。通过add_edge方法添加图的边,并能够通过print_graph方法输出图的邻接矩阵表示。
    • 使用邻接链表方式存储图:定义一个EdgeNode类表示图中的边,以及一个GraphList类表示图本身,包含顶点数和邻接链表。通过add_edge方法添加图的边,并能够通过print_graph方法输出图的邻接链表表示。
  2. 图的输出
    • 针对每种存储方式,实现对图的输出功能。对于邻接矩阵,输出其二维数组形式;对于邻接链表,以顶点为起点,输出其所有相邻顶点和对应的权重,形成链式结构。
  3. 示例图的存储与输出
    • 通过给出的示例图(包含有向图和无向图),分别使用邻接矩阵和邻接链表方式进行存储,并输出存储结果,以验证存储方式和输出功能的正确性。

三、实验演示

        1.邻接矩阵方法&实验结果截图:

#邻接矩阵
class GraphMatrix:def __init__(self, num_vertices):self.num_vertices = num_vertices# 使用 float('inf') 表示无边连接的权重self.matrix = [[float('inf')] * num_vertices for _ in range(num_vertices)]# 可以添加一行一列用于表示自身到自身的权重(通常为0,但在这个例子中我们不存储它)def add_edge(self, u, v, weight):self.matrix[u][v] = weight# 在无向图中,也需要添加下面这行# self.matrix[v][u] = weightdef print_graph(self):for row in self.matrix:print(row)# 示例g = GraphMatrix(5)
g.add_edge(0, 1, 5)
g.add_edge(0, 4, 10)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 1)
g.add_edge(1, 4, 8)
g.add_edge(3, 4, 6)g.print_graph()

        2.邻接链表&实验结果截图:

# 邻接链表
class EdgeNode:def __init__(self, vertex, weight):self.vertex = vertexself.weight = weightself.next = Noneclass GraphList:def __init__(self, num_vertices):self.num_vertices = num_verticesself.adj_list = [None] * num_verticesdef add_edge(self, u, v, weight):new_node = EdgeNode(v, weight)new_node.next = self.adj_list[u]self.adj_list[u] = new_node# 在无向图中,也需要添加反向边# new_node_reverse = EdgeNode(u, weight)# new_node_reverse.next = self.adj_list[v]# self.adj_list[v] = new_node_reversedef print_graph(self):for i in range(self.num_vertices):print(f"Vertex {i}: ", end="")current = self.adj_list[i]while current:print(f"({current.vertex}, {current.weight}) ->", end="")current = current.nextprint("None")# 示例g = GraphList(5)
g.add_edge(0, 1, 5)
g.add_edge(0, 4, 10)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 1)
g.add_edge(1, 4, 8)
g.add_edge(3, 4, 6)g.print_graph()


http://www.ppmy.cn/ops/145425.html

相关文章

37 Opencv SIFT 特征检测

文章目录 Ptr<SIFT> SIFT::create示例 Ptr SIFT::create Ptr<SIFT> SIFT::create(int nfeatures 0,int nOctaveLayers 3,double contrastThreshold 0.04,double edgeThreshold 10,double sigma 1.6 );参数说明&#xff1a;nfeatures&#xff1a;类型&#x…

计算机操作系统与安全复习笔记

1 绪论 操作系统目标: 方便性; 有效性; 可扩充性; 开放性. 作用: 用户与计算机硬件系统之间的接口; 计算机资源的管理者; 实现了对计算机资源的抽象; 计算机工作流程的组织者. 多道程序设计: 内存中同时存放若干个作业, 使其共享系统资源且同时运行; 单处理机环境下宏观上并行…

从单机到微服务的转型之路

从单机到微服务的转型之路 电商网站架构的演进与技术实现初期架构&#xff1a;单机架构第二阶段&#xff1a;应用与数据库分离第三阶段&#xff1a;应用服务集群与负载均衡第四阶段&#xff1a;数据库读写分离与缓存优化第五阶段&#xff1a;微服务架构 架构的优点&#xff1a;…

EasyExcel停更,FastExcel接力

11月6日消息&#xff0c;阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布&#xff0c;将停止更新&#xff0c;未来将逐步进入维护模式&#xff0c;将继续修复Bug&#xff0c;但不再主动新增功能。 EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称&#xff0c;官方…

Day58 图论part08

拓扑排序精讲 拓扑排序看上去很复杂,其实了解其原理之后,代码不难 代码随想录 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();List<List<Integer&…

【信息系统项目管理师】第11章:项目成本管理-基础和过程 考点梳理

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 11.1 管理基础11.1.1 重要性和意义11.1.2 相关术语和定义11.1.3 管理新实践11.2 项目成本管理过程11.2.1 过程概述11.2.2 裁剪考虑因素11.2.3 敏捷与适应方法【学习建议】本章节内容属于10大管理知识领域中的重…

Docker搭建YesPlayMusic云音乐播放器并实现异地远程连接播放歌曲

文章目录 前言1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 前言 本文主要介绍如何在本地Linux服务器快速搭建 YesPlayMusic 云音乐播放器&#xff0c;并结合 cpolar 内网穿透工具实现随时随地远程访问局域网内的音乐播放器&am…

攻防世界web第三题file_include

<?php highlight_file(__FILE__);include("./check.php");if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} ?>这是题目 惯例&#xff1a; 代码审查&#xff1a; 1.可以看到include(“./check.php”);猜测是同级目录下有一个ch…