图源点到各个点的最短路径(DIJ)

# -*- coding: cp936 -*-
import copy
MV = 0xFFFFFFFF
Vertexs = {0:'v0',1:'v1',2:'v2',3:'v3',4:'v4',5:'v5'}
Arcs = [[MV,MV,10,MV,30,100],[MV,MV,5,MV,MV,MV],[MV,MV,MV,50,MV,MV],\
        [MV,MV,MV,MV,MV,10],[MV,MV,MV,20,MV,MV],[MV,MV,MV,MV,MV,MV]]

#初始化源点到目标点的最短路径    
def init_dist(srcVertex):
    return Arcs[srcVertex]
#某个节点的最短路径
def findShortestPathToVertex(srcVertex, Vertex, dist, targetSet):
    temp = Arcs[srcVertex][Vertex]
    path = [srcVertex, Vertex]
    rslt = []
    
    for i in targetSet.keys():
        if MV != Arcs[i][Vertex] and i != srcVertex:
            if Arcs[i][Vertex] + dist[i] < temp:
                temp = Arcs[i][Vertex] + dist[i]
                path = copy.deepcopy(targetSet[i])
                path.append(Vertex)

    rslt.append(temp)
    rslt.append(path)
    return rslt

#从未获取最短路径的节点中找到一条最短路径的节点        
def findShortestPath(srcVertex, dist, targetSet):
    minValue = MV
    Vertex = -1
    
    for i in Vertexs.keys():
        if i not in targetSet.keys():
            path = findShortestPathToVertex(srcVertex, i, dist, targetSet)
            if path[0] < minValue:
                minValue = path[0]
                Vertex = i
                pathInfo = path[1]
                
    if -1 != Vertex:
        targetSet[Vertex] = pathInfo
        dist[Vertex] = minValue
            
def shortPath_DIJ(srcVertex):
    dist = init_dist(srcVertex)
    #targetSet = [srcVertex]
    targetSet = {srcVertex:[srcVertex]}

    for i in range(len(Vertexs) - 1):
        findShortestPath(srcVertex, dist, targetSet)

    print targetSet
    print dist
    
shortPath_DIJ(0)
                    

 

posted @ 2013-06-18 23:27  平凡之路  阅读(1095)  评论(0编辑  收藏  举报