IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 最短路问题:弗洛伊德算法及python实现 -> 正文阅读

[数据结构与算法]最短路问题:弗洛伊德算法及python实现

1.算法适用:

寻找给定的加权图中,网络上任意两点(node)间的最短路

2.算法步骤:

(1). 输入权矩阵(邻接矩阵): D(0)?= D
(2). 计算:Dk?= (d(k)ij)n××n?(k = 1,2,3,...,n)
其中, d(k)ij?= min[d(k)ij, d(k-1)ik?+ d(k-1)kj].
(3). 输出最短路:Dn?= (d(n)ij)n××n?当 Dn?= Dn+1时迭代结束.d(n)ij为vi到vj的最短路长

3.python实现:

import numpy as np
import copy

def get_matrix(num_node):
    #读取并生成邻接矩阵
    m = np.zeros((num_node,num_node),dtype=float)
    f = open('matrix_df.txt')
    lines = f.readlines()
    m_row = 0
    for line in lines:
        ls = line.strip('\n').split(' ')
        m[m_row:]=ls[0:num_node]
        m_row += 1
    f.close()
    p = np.array([[i] * num_node for i in range(num_node)])#初始化路径矩阵
    return m,p
#递归函数 回溯中间点    
def print_path(i, j):
    if i == j:
        #print(set_node.get(j+1),end='')
        print(j+1,end='')
    if i != j:
        print_path(i, p[i][j])
        #print('-->' + str(set_node.get(j+1)),end='')
        print('-->' + str(j+1),end='')

#floyd
def floyd(num_node, start_node, end_node):
    mat = copy.deepcopy(m)
    for k in range(num_node):
        for i in range(num_node):
            for j in range(num_node):
                if mat[i,k]+mat[k,j] < mat[i,j]:
                    mat[i,j] = mat[i,k]+mat[k,j]
                    p[i][j] = p[k][j]
    #print("\nPath:({}-->{}):".format(set_node.get(start_node),set_node.get(end_node)),end='\n')
    print("\nPath:({}-->{}):".format(start_node,end_node),end='\n')
    print_path(start_node-1,end_node-1)
    print('\nmin route:{}'.format(int(mat[start_node-1,end_node-1])))
    return mat, p
if __name__ == '__main__':
    #set_node = {1:'A',2:'B1',3:'B2',4:'B3',5:'C1',6:'C2',7:'D1',8:'D2',9:'D3',10:'E'} 当node不为数字时,用字典对应
    num_node = eval(input("阶数:"))
    m,p = get_matrix(num_node)
    floyd(num_node,1,6)

?

4. 算例:

邻接矩阵:

[0 1 2 inf inf inf
inf 0 4 5 inf inf
inf 4 0 inf -3 inf
inf -2 2 0 2 inf
inf inf 4 2 0 1
inf inf inf 5 inf 0]

输出结果:

阶数: 6

Path:(1-->6):
1-->3-->5-->6
min route:0
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:16:53  更:2022-01-08 14:19:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:23:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码