洛谷模板.Floyd的深度理解(python)

 先上代码:

n, m = map(int, input().split())
edge = [ [float('inf')]*n for _ in range(n)]
for i in range(m):
    u, v, w = map(int, input().split())
    edge[u-1][v-1] = min(edge[u-1][v-1], w)
    edge[v-1][u-1] = min(edge[v-1][u-1], w)
for i in range(n):
    edge[i][i] = 0
for k in range(n):
    for i in range(n):
        for j in range(n):
            edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j])
for i in range(n):
    for j in range(n):
        print(edge[i][j], end=' ')
    print()

floyd算法知道长什么样,就是三层for循环呗,但是理解起来不是很简单。

为什么要进行三层循环,因为三层循环之后,从节点i到节点j的所有路径都遍历了一遍,找到最小值。

我们节点i到节点j的最短路径(现在节点i和节点j是某两个节点,已经固定)考虑算法首先初始化,

如果i和j直接存在路径,那么edge[i][j] = w。或者不存在路径,edge[i][j]=inf。

现在开始第一层循环,k = 1:

        不考虑i==k和j==k的情况(毕竟如果相等,那么edge[i][j]任然等于w或者inf),现在i!=k and j!=k,那么edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j]),取值为节点i到j的情况,和节点i到k到j的情况,这里我就简写,i-j 和 i-1-j

k = 2:

        edge[i][j] = min(edge[i][j], edge[i][2] + edge[2][j]),这里面存在 i-j,和i-2-j的情况,只有这两个吗???第一重循环中,已经计算了任意两个节点以节点1为桥的情况,那么现在全部情况应该是:i-j, i-1-j, i-2-j, i-1-2-j, i-2-1-j 这五种情况。

k = ....

k取完1-n之后,edge[i][j] 表示从节点i到节点j的所有可能存在的路径的最小值。

所以Floyd能奏效。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Floyd算法是一种用于解决任意两点之间最短路径问题的动态规划算法。它可以在存在负权边和环的情况下仍然保证正确性。然而,Floyd算法本身并不直接用于避障问题,它更多地用于寻找最短路径。 如果你想要使用Python来实现避障算法,可以考虑使用其他算法,如A*算法或Dijkstra算法。这些算法更适合用于避障问题,因为它们可以根据给定的启发式函数或权重来找到最优路径。 以下是一个使用A*算法来实现避障的Python示例: ```python import heapq def astar(start, goal, obstacles): open_list = [(0, start)] closed_set = set() g_score = {start: 0} f_score = {start: heuristic(start, goal)} while open_list: current = heapq.heappop(open_list)[1] if current == goal: return reconstruct_path(goal) closed_set.add(current) for neighbor in get_neighbors(current): if neighbor in closed_set: continue tentative_g_score = g_score[current] + distance(current, neighbor) if neighbor not in g_score or tentative_g_score < g_score[neighbor]: g_score[neighbor] = tentative_g_score f_score[neighbor] = tentative_g_score + heuristic(neighbor, goal) heapq.heappush(open_list, (f_score[neighbor], neighbor)) return None def heuristic(node, goal): # 计算启发式函数的值 return abs(node[0] - goal[0]) + abs(node[1] - goal[1]) def distance(node1, node2): # 计算两个节点之间的距离 return abs(node1[0] - node2[0]) + abs(node1[1] - node2[1]) def get_neighbors(node): # 获取一个节点的邻居节点 neighbors = [] # 在这里添加获取邻居节点的逻辑 return neighbors def reconstruct_path(goal): # 重构路径 path = [] # 在这里添加重构路径的逻辑 return path # 示例使用 start = (0, 0) goal = (5, 5) obstacles = [(2, 2), (3, 3), (4, 4)] path = astar(start, goal, obstacles) print("Path:", path) ``` 这个示例使用A*算法来寻找从起点到目标点的最优路径,并避开了给定的障碍物。你可以根据实际情况修改`get_neighbors`函数来获取节点的邻居节点,以及修改`heuristic`和`distance`函数来计算启发式函数的值和节点之间的距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值