📌  相关文章
📜  未加权图中的最短路径(1)

📅  最后修改于: 2023-12-03 15:26:31.269000             🧑  作者: Mango

未加权图中的最短路径

在图论中,最短路径算法是一种用于计算图中两个顶点间最短路径的算法。在未加权图中,最短路径算法的实现相对容易一些。这篇文章将介绍未加权图中的最短路径算法,并提供一个简单的代码实现。

未加权图中的最短路径算法

未加权图中的最短路径算法使用广度优先搜索来查找两个顶点之间的最短路径。广度优先搜索的实现基于队列数据结构,每当一个顶点被扩展时,将其相邻的所有未被访问的顶点加入队列。当我们第一次访问目标顶点时,我们知道它是从起始顶点到目标顶点的最短路径。因为队列是先进先出的,所以搜索停止时,我们已经找到了最短路径。

代码实现

下面是一个未加权图中最短路径算法的简单Python实现:

from collections import deque

def bfs_shortest_path(graph, start, end):
    # create a queue for BFS
    queue = deque()
    # mark the start vertex as visited and enqueue it
    visited = set([start])
    queue.append((start, [start]))
    # iterate over the queue
    while queue:
        # dequeue a vertex from queue
        (vertex, path) = queue.popleft()
        # check if the vertex is the end vertex
        if vertex == end:
            return path
        # add the adjacent vertices to the queue
        for adjacent in graph[vertex]:
            if adjacent not in visited:
                visited.add(adjacent)
                queue.append((adjacent, path + [adjacent]))
    # if end vertex is not reached
    return []

这个函数采用广度优先搜索来查找两个顶点之间的最短路径。与标准广度优先搜索不同的是,该函数返回的路径是一个由顶点组成的列表,起始点是列表的第一个元素,目标点是列表的最后一个元素。

使用示例

假设我们有以下未加权无向图:

{
    'A': ['B', 'C'],
    'B': ['A', 'C', 'D'],
    'C': ['A', 'B', 'D', 'E'],
    'D': ['B', 'C', 'E', 'F'],
    'E': ['C', 'D'],
    'F': ['D']
}

我们想找出顶点A到顶点F之间的最短路径。我们可以使用bfs_shortest_path函数来找到这个路径:

graph = {
    'A': ['B', 'C'],
    'B': ['A', 'C', 'D'],
    'C': ['A', 'B', 'D', 'E'],
    'D': ['B', 'C', 'E', 'F'],
    'E': ['C', 'D'],
    'F': ['D']
}
start = 'A'
end = 'F'
shortest_path = bfs_shortest_path(graph, start, end)
print(shortest_path) # ['A', 'C', 'D', 'F']

这个例子输出了一个最短路径,该路径从顶点A开始,依次经过顶点C和D,最终到达了顶点F.

总结

未加权图中的最短路径算法使用广度优先搜索技术,按层次遍历图从而找到最短路径。本文给出了一个简单的Python实现,可以用于计算无向图中两个顶点之间的最短路径。