python最短路径算法,基于dijkstra

graph.py

  
#!/usr/bin/python

class Edge(object):
    def __init__(self, start, end, weight):
        self.startNodeId = start
        self.endNodeId = end
        self.weight = weight


class Node(object):
    def __init__(self, nodeId, edgeList):
        self.nodeId = nodeId
        self.edgeList = edgeList

        
class Path(object):
    def __init__(self, curNodeId):
        self.visited = False
        self.weight = 8888
        self.curNodeId = curNodeId
        self.routeList = []


class Graph(object):
    def __init__(self, nodeList):
        self.nodeList = nodeList
        self.pathDic = {}

        
    def initPaths(self, originNodeId):
        self.pathDic = {}
        originNode = None
        for node in self.nodeList:
            if node.nodeId == originNodeId:
                originNode = node 
            self.pathDic[node.nodeId] = Path(node.nodeId)


        if originNode is None:
            print "originNode is none"
            return
        else:
            for edge in originNode.edgeList:
               path =  self.pathDic[edge.endNodeId]
               if path is None:
                    print "path is None"
                    return
               else:
                    path.weight = edge.weight
                    path.routeList.append(originNodeId)


        path = self.pathDic[originNodeId]     
        path.weight = 0
        path.visit = True
        path.routeList.append(originNodeId)


    def getMinPath(self, originNodeId):
        destNode = None
        weight = 8888
        for node in self.nodeList:
            path = self.pathDic[node.nodeId]
            if path.visited == False and path.weight < weight:
                weight = path.weight
                destNode = node
        return destNode


    def dijkstra(self, originNodeId, destNodeId):
        self.initPaths(originNodeId)
        curNode = self.getMinPath(originNodeId)
        while curNode is not None:
            curPath = self.pathDic[curNode.nodeId]
            curPath.visited = True

            for edge in curNode.edgeList:
                minPath = self.pathDic[edge.endNodeId]
                if minPath.weight > (curPath.weight + edge.weight):
                    minPath.weight = curPath.weight + edge.weight
                    minPath.routeList = curPath.routeList + [curNode.nodeId]

            curNode = self.getMinPath(originNodeId)

        route = self.pathDic[destNodeId].routeList
        if route == []:
            return route
        else:    
            return route + [destNodeId]           

        


test.py

        
#!/usr/bin/python
#coding:utf-8
from dijkstra import Edge as Edge
from dijkstra import Node as Node
from dijkstra import Graph as Graph

edge11 = Edge("A", "B", 10)
edge12 = Edge("A", "C", 20)
edge13 = Edge("A", "E", 30)

edge21 = Edge("B", "C", 5)
edge22 = Edge("B", "E", 10)

edge31 = Edge("C", "D", 30)

edge51 = Edge("E", "D", 10)

node1 = Node("A", [edge11, edge12, edge13])
node2 = Node("B", [edge21, edge22])
node3 = Node("C", [edge31])
node4 = Node("D", [])
node5 = Node("E", [edge51])

graph = Graph([node1, node2, node3, node4, node5])

startNodeId = raw_input("请输入起点: ")
endNodeId = raw_input("请输入终点: ")

print "最短路径:", graph.dijkstra(startNodeId, endNodeId), "\n"

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值