图论是计算机科学和数学中的一个重要分支,它研究图结构及其应用。在本教程中,我们将从基础概念开始,逐步深入到一些常见的图论算法。

图的基本概念

  • 图(Graph):由顶点(Vertex)和边(Edge)组成的集合。
  • 无向图(Undirected Graph):边没有方向的图。
  • 有向图(Directed Graph):边有方向的图。
  • 顶点度(Degree of Vertex):与一个顶点相连的边的数量。

图的表示方法

  • 邻接矩阵(Adjacency Matrix)
  • 邻接表(Adjacency List)

常见的图论算法

  • 深度优先搜索(DFS)
  • 广度优先搜索(BFS)
  • 最短路径算法(Dijkstra算法、Floyd算法)
  • 最小生成树(Prim算法、Kruskal算法)

深度优先搜索(DFS)

深度优先搜索是一种用于遍历或搜索树或图的算法。它沿着一个分支一直走到尽头,然后回溯,再沿着另一条分支继续。

def dfs(graph, start):
    visited = set()
    stack = [start]

    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.add(vertex)
            # 处理当前顶点
            for neighbor in graph[vertex]:
                stack.append(neighbor)

最短路径算法(Dijkstra算法)

Dijkstra算法用于找到图中两点之间的最短路径。

def dijkstra(graph, start, end):
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    previous_vertices = {vertex: None for vertex in graph}

    vertices = graph.copy()

    while vertices:
        current_vertex = min(vertices, key=lambda vertex: distances[vertex])
        vertices.pop(current_vertex)

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

            if alternative_route < distances[neighbor]:
                distances[neighbor] = alternative_route
                previous_vertices[neighbor] = current_vertex

    path, current_vertex = [], end

    while previous_vertices[current_vertex] is not None:
        path.insert(0, current_vertex)
        current_vertex = previous_vertices[current_vertex]

    if path:
        path.insert(0, current_vertex)

    return path

扩展阅读

想要深入了解图论,可以参考以下本站教程:

Graph Theory