贪心算法求最短路径,用Python实现

本文介绍使用贪心算法寻找最短路径的方法,通过迭代从源点出发,每次都选择当前距离源点最近的点,直到到达目标点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要思想
首先找到离源点最近的点,然后以这个点为源点再进行迭代,重复以上步骤

#-*- coding: utf-8 -*-
if __name__ =="__main__":
    n=0
    print("请输入图中点的数量")
    n=input()
    juzhen=[[0 for i in range(n)] for m in range(n)]
    print("请依次输入矩阵")
    for i in range(n):
        for j in range(n):
            juzhen[i][j
### 使用Python实现贪心算法最短路径 #### 贪心算法简介 贪心算法是一种在每一步选择中都做出局部最优选择的策略,期望通过一系列这样的选择能够达到全局最优解。对于最短路径问题而言,贪心算法每次都会选择当前节点到相邻节点之间的最小权重边作为下一步行走的方向。 #### Python代码实现 下面是一个基于邻接矩阵表示图结构并利用贪心思想来寻找起点至终点之间最短路径的例子: ```python import sys def greedy_shortest_path(graph, start, end): n = len(graph) # 初始化距离数组和前驱结点列表 dist = [sys.maxsize] * n prev_node = [-1] * n visited = [False] * n current_node = start dist[start] = 0 while True: min_distance = sys.maxsize for i in range(n): if not visited[i] and dist[i] < min_distance: min_distance = dist[i] current_node = i if min_distance == sys.maxsize or current_node == end: break visited[current_node] = True for neighbor in range(n): weight = graph[current_node][neighbor] if (weight != 0) and ((dist[current_node] + weight) < dist[neighbor]): dist[neighbor] = dist[current_node] + weight prev_node[neighbor] = current_node path = [] at = end while at != -1: path.append(at) at = prev_node[at] path.reverse() return {'distance': dist[end], 'path': path} if dist[end] != sys.maxsize else None if __name__ == "__main__": INF = float('inf') G = [ [INF , 7 ,9 ,INF ,INF ,14 ], [7 ,INF ,10 ,15 ,INF ,INF], [9 ,10 ,INF ,11 ,INF ,2 ], [INF ,15 ,11 ,INF ,6 ,INF], [INF ,INF ,INF ,6 ,INF ,9 ], [14 ,INF ,2 ,INF ,9 ,INF]] result = greedy_shortest_path(G, 0, 4) if result is not None: print(f"The shortest distance from node {0} to node {4}: ",result['distance']) print("The corresponding path:", " -> ".join(str(i) for i in result['path'])) else: print("No reachable path found.") ``` 此段程序定义了一个`greedy_shortest_path()`函数用于计算给定无向加权图中的两个顶点间的最短路径及其长度。注意这里的输入参数graph是以二维列表形式给出的一张带权有向图;start代表起始位置编号;end则是目标位置编号[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值