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

一、实验目的

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

二、实验内容

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

三、实验演示

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

python 复制代码
#邻接矩阵
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] = weight

    def 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.邻接链表&实验结果截图:

python 复制代码
# 邻接链表
class EdgeNode:
    def __init__(self, vertex, weight):
        self.vertex = vertex
        self.weight = weight
        self.next = None


class GraphList:
    def __init__(self, num_vertices):
        self.num_vertices = num_vertices
        self.adj_list = [None] * num_vertices

    def 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_reverse

    def 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.next
            print("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()
相关推荐
CODE-boy121 分钟前
利用8个参数定义一个汽轮机,然后根据这8个参数生成汽轮机性能试验时的测点清单-pycharm-源代码(适用所有类型汽轮机)
ide·python·pycharm·汽轮机·性能试验
BirdMan9826 分钟前
在 Windows 11 上使用 PyCharm 创建一个 Flask 项目,并使用 `pipenv` 进行虚拟环境管理
windows·pycharm·flask
For the brave2 小时前
23年以后版本pycharm找不到conda可执行文件解决办法
ide·pycharm·conda
WIN赢7 小时前
【性能测试入门_01性能测试jmeter基础实操场景详解】
ide·python·pycharm
Serendipity_Carl10 小时前
Pandas数据清洗实战之清洗猫眼电影
python·pycharm·数据分析·pandas
一只_程序媛12 小时前
【leetcode hot 100 142】环形链表Ⅱ
算法·leetcode·链表
神里流~霜灭15 小时前
下降路径最⼩和(medium)
数据结构·c++·算法·链表·贪心算法·动态规划
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧15 小时前
C语言_数据结构总结4:不带头结点的单链表
c语言·开发语言·数据结构·算法·链表·visualstudio·visual studio
6v6-博客20 小时前
VS Code、PyCharm、IntelliJ IDEA 等 IDE 的配置和插件推荐
ide·pycharm·intellij-idea
做程序员的第一天1 天前
ubuntu下在pycharm中配置已有的虚拟环境
linux·ubuntu·pycharm