无向图-最短路径Dijkstra(迪杰斯特拉算法)算法

一、算法思路

1、采用广度优先搜索算法;

2、二维数组初始化无向图;

3、创建一个一维数组,初始化起点到其它所有节点的距离为无穷大,起点自己到自己的距离为0;

4、从起点开始找与起点相邻的其它节点的距离,将距离赋值到前面创建的一维数组,将此节点标记为已访问;

5、在一维数组中找一个没有访问过的节点,并且数值是最小的节点,将此节点作为起点重复第4步;

6、直至所有节点全部标记为已访问,程序执行结束;

二、代码

import sys
class Graph:
    #所有节点信息
    nodeAll = []
    #记录节点是否已访问 0否 1是
    visited = []
    #指定起始点到所有其他点的距离
    minDis = []
    #所有的边
    edge = []
    #节点数量
    nodeNum = 0
    #路径记录
    paths = []

    #构造方法,初始化整个无向图
    def __init__(self, nodeAll):
        self.nodeAll = nodeAll
        self.nodeNum = len(nodeAll)
        #初始化所有节点都未访问
        self.visited = [0] * self.nodeNum

        #创建一个二维数据,是浅拷贝,每一维的数组都是指向同一个内容地址,会有问题
        #test = [[0] * nodeNum] * nodeNum
        #test[0][1] = 1

        #创建一个二维数组,每次都会创建一个新的数组
        self.edge = [([0] * self.nodeNum) for i in range(self.nodeNum)]
        self.visited = [0] * self.nodeNum
        # 初始化指定起点到其它所有节点的距离无穷大
        self.minDis = [sys.maxsize] * self.n
迪杰斯特拉Dijkstra算法用于求解带权有向图或无向图中,从一个源节点到其余各节点的最短路径。对于PTA 6 - 1题目使用迪杰斯特拉算法求解最短路径,以下是具体的解题思路和代码实现。 ### 解题思路 1. **初始化**:创建距离数组`dist`用于存储源节点到各个节点的最短距离,初始时源节点到自身的距离为0,到其他节点的距离为无穷大。创建一个集合`visited`用于记录已经确定最短路径的节点,初始为空。 2. **选择当前距离源节点最近且未确定最短路径的节点**:从`dist`数组中选择距离源节点最近且未在`visited`集合中的节点`u`。 3. **更新距离**:对于节点`u`的所有邻接节点`v`,如果通过节点`u`到达节点`v`的距离比当前记录的距离更短,则更新`dist[v]`的值。 4. **标记节点**:将节点`u`加入`visited`集合,表示该节点的最短路径已经确定。 5. **重复步骤2 - 4**:直到所有节点都被加入`visited`集合。 ### 代码实现 ```python import sys def dijkstra(graph, start): num_vertices = len(graph) # 初始化距离数组 dist = [sys.maxsize] * num_vertices dist[start] = 0 # 初始化访问集合 visited = [False] * num_vertices for _ in range(num_vertices): # 选择当前距离源节点最近且未确定最短路径的节点 min_dist = sys.maxsize min_index = -1 for v in range(num_vertices): if not visited[v] and dist[v] < min_dist: min_dist = dist[v] min_index = v # 标记节点为已访问 visited[min_index] = True # 更新距离 for v in range(num_vertices): if not visited[v] and graph[min_index][v] > 0 and dist[min_index] + graph[min_index][v] < dist[v]: dist[v] = dist[min_index] + graph[min_index][v] return dist # 示例图的邻接矩阵表示 graph = [ [0, 4, 0, 0, 0, 0, 0, 8, 0], [4, 0, 8, 0, 0, 0, 0, 11, 0], [0, 8, 0, 7, 0, 4, 0, 0, 2], [0, 0, 7, 0, 9, 14, 0, 0, 0], [0, 0, 0, 9, 0, 10, 0, 0, 0], [0, 0, 4, 14, 10, 0, 2, 0, 0], [0, 0, 0, 0, 0, 2, 0, 1, 6], [8, 11, 0, 0, 0, 0, 1, 0, 7], [0, 0, 2, 0, 0, 0, 6, 7, 0] ] start_vertex = 0 shortest_distances = dijkstra(graph, start_vertex) print("从节点", start_vertex, "到其他节点的最短距离为:", shortest_distances) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值