python 与 图

图的定义

在 Python 中,可以使用字典来表示图。字典的键表示图中的顶点,而对应的值是与该顶点直接相连的顶点及其边的信息。

通常有两种方式来表示图:

  1. 邻接列表(Adjacency List): 使用字典来表示,其中每个顶点对应一个键,值是一个列表,存储与该顶点相邻的顶点及其边的信息。

  2. 邻接矩阵(Adjacency Matrix): 使用二维列表(或二维数组)来表示,其中每行和每列分别对应图中的顶点,矩阵元素表示顶点之间是否相连,以及边的权重信息。

下面分别介绍这两种方式:

1. 邻接列表

graph = {
   
    'A': {
   'B': 1, 'C': 4},
    'B': {
   'A': 1, 'C': 2, 'D': 5},
    'C': {
   'A': 4, 'B': 2, 'D': 1},
    'D': {
   'B': 5, 'C': 1}
}

在这个示例中,顶点 ‘A’ 与 ‘B’ 和 ‘C’ 相连,边的权重分别为 1 和 4。

2. 邻接矩阵

# 定义顶点列表
vertices = ['A', 'B', 'C', 'D']

# 定义邻接矩阵
graph = [
    [0, 1, 4, 0],
    [1, 0, 2, 5],
    [4, 2, 0, 1],
    [0, 5, 1, 0]
]

在这个示例中,行和列分别代表顶点 ‘A’, ‘B’, ‘C’, ‘D’,而矩阵中的元素表示两个顶点之间的边的权重。如果两个顶点之间没有边相连,则对应元素为 0。

在实际应用中,根据具体情况选择邻接列表或邻接矩阵表示图。如果图是稀疏的(即顶点之间的边相对较少),通常使用邻接列表更加高效。而如果图是稠密的(即顶点之间的边较多),则邻接矩阵更为适用。

图的访问

访问图的方式取决于图的表示方法。下面分别介绍如何访问邻接列表和邻接矩阵表示的图:

1. 邻接列表

对于邻接列表,可以通过字典的键来访问顶点,并通过键对应的值(也是一个字典)来获取与该顶点相邻的顶点及其边的信息。

graph = {
   
    'A': {
   'B': 1, 'C': 4},
    'B': {
   'A': 1, 'C': 2, 'D': 5},
    'C': {
   'A': 4, 'B': 2, 'D': 1},
    'D': {
   'B': 5, 'C': 1}
}

# 访问顶点 'A' 的相邻顶点及其边的信息
neighbors_of_A = graph['A']
print(neighbors_of_A)  # 输出:{'B': 1, 'C': 4}

# 获取顶点 'A' 到顶点 'B' 的边的权重
weight_from_A_to_B = graph['A']['B']
print(weight_from_A_to_B)  # 输出:1

2. 邻接矩阵

对于邻接矩阵,可以通过行和列的索引来访问对应的顶点,并通过矩阵中的元素来获取两个顶点之间的边的权重信息。

# 定义顶点列表
vertices = ['A', 'B', 'C', 'D']

# 定义邻接矩阵
graph = [
    [0, 1, 4, 0],
    [1, 0, 2, 5],
    [4, 2, 0, 1],
    [0, 5, 1, 0]
]

# 获取顶点 'A' 到顶点 'B' 的边的权重
weight_from_A_to_B = graph[vertices.index('A')][vertices.index('B')]
print(weight_from_A_to_B)  # 输出:1

在邻接矩阵中,可以通过 vertices.index('顶点名称') 获取对应顶点的索引,然后使用索引来访问矩阵中的元素。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-11 06:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-11 06:30:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-11 06:30:02       82 阅读
  4. Python语言-面向对象

    2024-02-11 06:30:02       91 阅读

热门阅读

  1. 聊聊PowerJob的InstanceStatusCheckService

    2024-02-11 06:30:02       39 阅读
  2. 【sass】 中使用 /deep/ 修改 elementUI 组件样式报错

    2024-02-11 06:30:02       47 阅读
  3. redis单线程还快的原因

    2024-02-11 06:30:02       52 阅读
  4. 【讨论】C语言提高之指针表达式

    2024-02-11 06:30:02       47 阅读
  5. leetcode - 368. Largest Divisible Subset

    2024-02-11 06:30:02       42 阅读
  6. 从零开始:用 Rust 编写你的第一个 Web 服务

    2024-02-11 06:30:02       45 阅读
  7. 如何为Kafka加上账号密码(二)

    2024-02-11 06:30:02       53 阅读
  8. C#系列-C#访问MongoDB+redis+kafka(7)

    2024-02-11 06:30:02       51 阅读