zoukankan      html  css  js  c++  java
  • 算法90----图的最短路径

    一、单源最短路径:迪杰斯特拉【权值需非负】

    目标:从某个起点出发,找到到各个点的最短距离。

    思路:一个S集合存已经遍历的顶点,一个Q集合存未遍历的顶点。一个dist列表存从初始点到当前点的最短路径,即dist[i] 表示初始点到i所需的最短距离。

    如果用堆优先队列来找dist中最小值,时间复杂度为O(E+VlogV),否则时间复杂度为O(V2),V 为顶点。

    伪代码:

      

    代码:

    MAX_value = 999999
    def dijkstra(graph, s):
        dist = [MAX_value] * len(graph)
        dist[s] = 0
        S = []
        Q = [i for i in range(len(graph))]
        while Q:
            u_dist = min([d for i,d in enumerate(dist) if i in Q])
            u = dist.index(u_dist)
            S.append(u)
            Q.remove(u)
            for v , d in enumerate(graph[u]):
                if 0 < d < MAX_value:
                    dist[v] = min(dist[v] , dist[u] + d)
        return dist
    
    
    if __name__ == '__main__':
        graph_list = [[0, 9, MAX_value, MAX_value, MAX_value, 14, 15, MAX_value],
                      [9, 0, 24, MAX_value, MAX_value, MAX_value, MAX_value, MAX_value],
                      [MAX_value, 24, 0, 6, 2, 18, MAX_value, 19],
                      [MAX_value, MAX_value, 6, 0, 11, MAX_value, MAX_value, 6],
                      [MAX_value, MAX_value, 2, 11, 0, 30, 20, 16],
                      [14, MAX_value, 18, MAX_value, 30, 0, 5, MAX_value],
                      [15, MAX_value, MAX_value, MAX_value, 20, 5, 0, 44],
                      [MAX_value, MAX_value, 19, 6, 16, MAX_value, 44, 0]]
        distance = dijkstra(graph_list, 0)
        print(distance)

     二、弗洛伊德算法【所有节点的最短路径】---动态规划

    思路:时间复杂度O(n3),

    代码:DP相当于上面的Dis矩阵

    MAX_value = 99999
    def Floyd(graph):
        N = len(graph)
        DP = [[MAX_value] * N for i in range(N)]
        path = [[MAX_value] * N for i in range(N)]
        #####初始化DP和path矩阵。DP相当于动态规划的DP矩阵,path【i】【j】是记录i到j的最短路径的中间节点。
        for i in range(N):
            for j in range(N):
                DP[i][j] = graph[i][j]
                path[i][j] = -1
        ######动态规划过程
        for i in range(N):
            for j in range(N):
                for k in range(N):
                    if DP[i][j] > DP[i][k] + DP[k][j]:
                        DP[i][j] = DP[i][k] + DP[k][j]
                        path[i][j] = k
        return DP,path
    if __name__ == '__main__':
        graph_list = [[0, 9, MAX_value, MAX_value, MAX_value, 14, 15, MAX_value],
                      [9, 0, 24, MAX_value, MAX_value, MAX_value, MAX_value, MAX_value],
                      [MAX_value, 24, 0, 6, 2, 18, MAX_value, 19],
                      [MAX_value, MAX_value, 6, 0, 11, MAX_value, MAX_value, 6],
                      [MAX_value, MAX_value, 2, 11, 0, 30, 20, 16],
                      [14, MAX_value, 18, MAX_value, 30, 0, 5, MAX_value],
                      [15, MAX_value, MAX_value, MAX_value, 20, 5, 0, 44],
                      [MAX_value, MAX_value, 19, 6, 16, MAX_value, 44, 0]]
        print(Floyd(graph_list))

      

  • 相关阅读:
    cs231n--详解卷积神经网络
    Spring 2017 Assignments2
    深度神经网络基础
    cs231n官方note笔记
    Spring 2017 Assignments1
    问题
    win7下解决vs2015新建项目,提示“未将对象引用设置到引用实例“的问题
    项目二:人脸识别
    ubutu强制关闭应用程序的方法
    将caj文件转化为pdf文件进行全文下载脚本(ubuntu下亲测有用)
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/10503983.html
Copyright © 2011-2022 走看看