zoukankan      html  css  js  c++  java
  • [算法]获得最短路径的Floyd与Dijkstra算法

    Floyd算法和Dijkstar算法是用来获得图中两点最短路径的算法。Dijkstar算法最终能够得到一个节点到其他所有节点的最短路径,而Floyd算法最终能够找出每对点之间的最短距离。

    Dijkstar算法

    问题描述:给定图G,求其顶点t到其他所有点的最短路径。

    算法描述:将图所有点的集合S分为两部分,V和S-V。V集合是已经得到最短路径的点的集合,在初始情况下V中只有一个顶点t,S-V是还未得到最短路径点的集合。然后,在每一次迭代过程中取得S-V集中到V集合任一点距离最短的点,将其加到V集合,从V-S集合删除。重复此过程直到S-V集合为空。

    时间复杂度:O(|E|+|V|\log|V|)

    示例:

    python实现:

    View Code
    maxDis=1000000
    def Dijkstar(G,t):
        
        n=len(G) # nodes number
        preNode=[t for i in range(0,n)] # the previous nodes
        distance=G[t][:] # the cur shortest distance
        short=[-1 for i in range(0,n)] #the final shortest diatance
        
        distance[t]=-1
        short[t]=0
        count=1
    
        while count<n:
            minDis=maxDis
            minNode=-1
            for i,dis in enumerate(distance):
                if dis>0 and dis<minDis:
                    minNode=i
                    minDis=dis
                    
            count+=1
            short[minNode]=minDis
            distance[minNode]=-1    # delete
    
            for j,disj in enumerate(distance):
                if disj<0: continue
                if minDis+G[minNode][j]< disj:
                    distance[j]=minDis+G[minNode][j]
                    preNode[j]=minNode
    
        return short,preNode
    
    
    if __name__=='__main__':
        G=[
            [0,6,3,maxDis,maxDis,maxDis],
            [6,0,2,5,maxDis,maxDis],
            [3,2,0,3,4,maxDis],
            [maxDis,5,3,0,2,3],
            [maxDis,maxDis,4,2,0,5],
            [maxDis,maxDis,maxDis,3,5,0]
            ]
        short,prevNode=Dijkstar(G,0)
        print short
            
            
        

     Floyd算法

    问题描述:给定图G,得到每个点对的最短距离。

    算法描述:Floyd算法是一个动态规划算法,最初矩阵A0是图的邻接矩阵,AK矩阵表示从i到j的最短路径,这些路径不能能通过大于K的节点,最终的矩阵AN就是想要得到的矩阵了。那么AK矩阵与A(K+1)矩阵有什么关系呢?关系就是A(K+1)[i,j]=min(A(K)[i,j],A(K)[i,k]+A(K)[k,j]),也就是看加上K点后,是不是能找到更短的距离。

    时间复杂度:O(|V|^3) 顶点数的三次方。

    示例:一上面的图为例子,下面展示了矩阵系列的建立过程:

    python代码:

    View Code
    import copy
    maxDis=1000000
    def Floyd(G):
        n=len(G)
        path=copy.deepcopy(G)
        for k in range(0,n):
            for i in range(0,n):
                for j in range(0,n):
                    path[i][j]=min(path[i][j],path[i][k]+path[k][j])
        return path
            
    
    if __name__=='__main__':
        G=[
            [0,6,3,maxDis,maxDis,maxDis],
            [6,0,2,5,maxDis,maxDis],
            [3,2,0,3,4,maxDis],
            [maxDis,5,3,0,2,3],
            [maxDis,maxDis,4,2,0,5],
            [maxDis,maxDis,maxDis,3,5,0]
            ]
        path=Floyd(G)
        for i in range(0,len(G)):
            print path[i]
  • 相关阅读:
    INVALID_STATE_ERR: DOM Exception 11
    测试用户的网络环境
    CentOS修改IP、DNS、网关
    读《结网》
    命名函数表达式
    JavaScript中的编码函数
    linux下C程序printf没有立即输出的问题及我的Makefile文件
    学习使用vimperator
    thinkpad e40 安装 nvidia显卡驱动之后
    fedora:在命令行下删除文件到回收站
  • 原文地址:https://www.cnblogs.com/orchid/p/3015161.html
Copyright © 2011-2022 走看看