python實(shí)現(xiàn)狄克斯特拉算法
dictRoute = {}dictRoute[nodeId] = {}dictRoute[nodeId][nebrId] = distance操作:①根據(jù)nodeId找到該node的路由信息②根據(jù)nebrId找到某一條路由的距離
2、節(jié)點(diǎn)信息dictNode = {}dictNode[nodeId] = [shortDis, fatherId, bIsCheck]操作:①找到nodes中最短距離的節(jié)點(diǎn)②查找節(jié)點(diǎn)的shortDis,根據(jù)情況更新shortDis、fatherId③檢查過的節(jié)點(diǎn),更新bIsCheck
功能實(shí)現(xiàn)/* 找到最短距離節(jié)點(diǎn)的Id,已經(jīng)檢查的不計算在內(nèi) */def FindShortNodeId(dictNode):return shortNodeId
/* dikstra算法流程 */1、找到最短距離節(jié)點(diǎn)Id,并標(biāo)記已檢查過 (如果節(jié)點(diǎn)Id不存在,表示查找完成)2、得到最短距離節(jié)點(diǎn)的距離3、輪詢最短距離節(jié)點(diǎn)的鄰居節(jié)點(diǎn)4、計算鄰居節(jié)點(diǎn)的新距離、得到原最短距離,進(jìn)行比較5、如果新距離 < 原距離,則更新鄰居節(jié)點(diǎn)最短距離概括為兩步:步驟1 (1)- 找到當(dāng)前最短距離節(jié)點(diǎn)步驟2(2~5) - 更新最短距離節(jié)點(diǎn)鄰居節(jié)點(diǎn)信息
代碼實(shí)現(xiàn)import osimport sys’’’信息輸入:1、節(jié)點(diǎn)數(shù)目、路由數(shù)目2、路由信息 3、開始節(jié)點(diǎn)、結(jié)束節(jié)點(diǎn)’’’nodeNum = 0 # 節(jié)點(diǎn)數(shù)目routeNum = 0 # 路由數(shù)目listRoute = [] # 臨時存儲輸入的路由信息listNodeId = []# 臨時存儲節(jié)點(diǎn)id nodeIdStart = ’’nodeIdEnd = ’’dictRoute = {} # 解析后的路由信息dictNode = {} # 節(jié)點(diǎn)信息# 輸入節(jié)點(diǎn)數(shù)目、路由數(shù)目strInput = input()list0 = strInput.split(’ ’)nodeNum = int(list0[0])routeNum = int(list0[1])# 輸入路由信息for index in range(routeNum): strInput = input() listRoute.append(strInput) # 輸入開始節(jié)點(diǎn)、結(jié)束節(jié)點(diǎn)strInput = input()list0 = strInput.split(’ ’)nodeIdStart = list0[0]nodeIdEnd = list0[1]# 解析得到節(jié)點(diǎn)IdlistNodeId.append(nodeIdStart)listNodeId.append(nodeIdEnd)for index in listRoute: list0 = index.split(’ ’) nodeIdA = list0[0] nodeIdB = list0[1] if nodeIdA not in listNodeId: listNodeId.append(nodeIdA) if nodeIdB not in listNodeId: listNodeId.append(nodeIdB) # 初始化路由信息字典、節(jié)點(diǎn)信息字典for nodeId in listNodeId: # 節(jié)點(diǎn)字典信息 dictNode[nodeId] = [10000, ’’, False] # 最短距離、父節(jié)點(diǎn)、是否檢查過 # 每個路由字典創(chuàng)建 dictRoute[nodeId] = {}dictNode[nodeIdStart][0] = 0# 初始化路由信息for index in listRoute: list0 = index.split(’ ’) nodeIdA = list0[0] nodeIdB = list0[1] dictRoute[nodeIdA][nodeIdB] = int(list0[2]) dictRoute[nodeIdB][nodeIdA] = int(list0[2]) # 打印輸入信息def PrintInputInfo(): print(’nodeNum routeNum:’) print(str(nodeNum) + ’ ’ + str(routeNum)) print(’nodeStart nodeEnd’) print(nodeIdStart+’ ’+nodeIdEnd) print(’route info:’) for nodeId in dictRoute.keys(): for nebrId in dictRoute[nodeId].keys(): print(nodeId+’->’+nebrId+’ = ’+str(dictRoute[nodeId][nebrId])) print(’node info:’) for nodeId in dictNode.keys(): print(nodeId+’:’+str(dictNode[nodeId][0])+’ ’+dictNode[nodeId][1]+’ ’+str(dictNode[nodeId][2]))#PrintInputInfo()’’’狄克斯特拉實(shí)現(xiàn)’’’# 找到最短距離節(jié)點(diǎn)iddef FindShortNodeId(dictNode): shortNodeId = ’’ shortDis = 10000 for nodeId in dictNode.keys(): if dictNode[nodeId][0] < shortDis and dictNode[nodeId][2] == False: shortNodeId = nodeId shortDis = dictNode[nodeId][0] return shortNodeId # 狄克斯特拉算法shortNodeId = FindShortNodeId(dictNode)while shortNodeId: if shortNodeId == nodeIdEnd: break; dictNode[shortNodeId][2] = True shortDis = dictNode[shortNodeId][0] for nebrId in dictRoute[shortNodeId].keys(): newDis = dictRoute[shortNodeId][nebrId] + shortDis if newDis < dictNode[nebrId][0]: dictNode[nebrId][0] = newDis dictNode[nebrId][1] = shortNodeId shortNodeId = FindShortNodeId(dictNode) # 打印結(jié)果listRst = []nodeId = nodeIdEndwhile nodeId: listRst.append(nodeId) nodeId = dictNode[nodeId][1]listRst.reverse()strRst = ’’for nodeId in listRst: if nodeId == listRst[-1]: strRst += nodeId else: strRst += nodeId + ’->’if dictNode[nodeIdEnd][1] == ’’: print(’cant reach ’+nodeIdEnd)else: print(strRst) print(dictNode[nodeIdEnd][0])測試用例及驗(yàn)證
Case1輸入:6 41 2 21 3 42 5 35 6 22 6
輸出:
Case2輸入:4 5S A 6S B 2B A 3A E 1B E 5S E
輸出:
Case3(找不到終點(diǎn))輸入:6 6S A 2S B 1A C 4A B 1B D 2C D 3S End
輸出:
Case4輸入:6 8S A 5S B 1A C 1A B 1B D 5C D 1D End 1C End 3S End
輸出:
以上就是python實(shí)現(xiàn)狄克斯特拉算法的詳細(xì)內(nèi)容,更多關(guān)于python狄克斯特拉的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. asp讀取xml文件和記數(shù)2. asp批量添加修改刪除操作示例代碼3. 使用Spry輕松將XML數(shù)據(jù)顯示到HTML頁的方法4. ASP中解決“對象關(guān)閉時,不允許操作。”的詭異問題……5. CSS可以做的幾個令你嘆為觀止的實(shí)例分享6. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera7. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案8. CSS3中Transition屬性詳解以及示例分享9. html小技巧之td,div標(biāo)簽里內(nèi)容不換行10. 告別AJAX實(shí)現(xiàn)無刷新提交表單
