Python数据结构之图

图(Graph)是一种非常常用的数据结构,它由节点(顶点)和边组成,用来表示各种关系和连接。在计算机科学中,图被广泛应用于网络、社交媒体、路由算法等领域。Python 提供了许多库和模块来操作图,本文将介绍一些常用的图数据结构以及对应的操作方法。

图的表示

在 Python 中,我们可以使用邻接矩阵或邻接表来表示图。邻接矩阵是一个二维数组,其中行表示起始顶点,列表示目标顶点,如果两个顶点之间有边,则对应元素的值为1,否则为0。邻接表则是一个以顶点作为键、以与该顶点相邻的顶点列表作为值的字典。

下面是一个使用邻接矩阵表示的图的示例:

graph_matrix = [
  [0, 1, 1, 0],
  [1, 0, 0, 1],
  [1, 0, 0, 1],
  [0, 1, 1, 0]
]

下面是一个使用邻接表表示的图的示例:

graph_dict = {
  'A': ['B', 'C'],
  'B': ['A', 'D'],
  'C': ['A', 'D'],
  'D': ['B', 'C']
}

图的遍历

图的遍历是指访问图中所有节点的过程。常见的图遍历方法有深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索是一种递归的遍历方法,它从根节点开始,一直遍历到最深处,然后回溯到上一层继续遍历。

下面是一个使用深度优先搜索遍历图的示例:

def dfs(graph, start, visited):
    visited.add(start)
    print(start, end=" ")
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

dfs(graph_dict, 'A', set())

广度优先搜索是一种迭代的遍历方法,它从根节点开始,按层遍历,先访问邻居节点,再访问邻居的邻居节点。

下面是一个使用广度优先搜索遍历图的示例:

def bfs(graph, start):
    visited = set()
    queue = [start]
    visited.add(start)
    while queue:
        node = queue.pop(0)
        print(node, end=" ")
        for neighbor in graph[node]:
            if neighbor not in visited:
                queue.append(neighbor)
                visited.add(neighbor)

bfs(graph_dict, 'A')

图的最短路径

图的最短路径指的是从一个顶点到另一个顶点的最短路径。常用的最短路径算法有 Dijkstra 算法和 Floyd-Warshall 算法。

Dijkstra 算法是一种贪心算法,它通过不断选择当前最短路径的节点来计算最短路径。

下面是一个使用 Dijkstra 算法计算最短路径的示例:

import heapq

def dijkstra(graph, start):
    distances = {vertex: float('inf') for vertex in graph}
    distances[start] = 0
    queue = [(0, start)]

    while queue:
        current_distance, current_vertex = heapq.heappop(queue)

        if current_distance > distances[current_vertex]:
            continue

        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight

            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(queue, (distance, neighbor))

    return distances

graph = {
    'A': {'B': 7, 'C': 9, 'F': 14},
    'B': {'A': 7, 'C': 10, 'D': 15},
    'C': {'A': 9, 'B': 10, 'D': 11, 'F': 2},
    'D': {'B': 15, 'C': 11, 'E': 6},
    'E': {'D': 6, 'F': 9