婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python實現狄克斯特拉算法

python實現狄克斯特拉算法

熱門標簽:原裝電話機器人 西藏智能外呼系統五星服務 在哪里辦理400電話號碼 平頂山外呼系統免費 千陽自動外呼系統 工廠智能電話機器人 江蘇客服外呼系統廠家 400電話申請服務商選什么 清遠360地圖標注方法

數據結構

1、路由信息

dictRoute = {}
dictRoute[nodeId] = {}
dictRoute[nodeId][nebrId] = distance
操作:
①根據nodeId找到該node的路由信息
②根據nebrId找到某一條路由的距離

2、節點信息

dictNode = {}
dictNode[nodeId] = [shortDis, fatherId, bIsCheck]
操作:
①找到nodes中最短距離的節點
②查找節點的shortDis,根據情況更新shortDis、fatherId
③檢查過的節點,更新bIsCheck

功能實現

/* 找到最短距離節點的Id,已經檢查的不計算在內 */
def FindShortNodeId(dictNode):
return shortNodeId

/* dikstra算法流程 */
1、找到最短距離節點Id,并標記已檢查過 (如果節點Id不存在,表示查找完成)
2、得到最短距離節點的距離
3、輪詢最短距離節點的鄰居節點
4、計算鄰居節點的新距離、得到原最短距離,進行比較
5、如果新距離 原距離,則更新鄰居節點最短距離
概括為兩步:步驟1 (1)- 找到當前最短距離節點
步驟2(2~5) - 更新最短距離節點鄰居節點信息

代碼實現

import os
import sys

'''
信息輸入:
1、節點數目、路由數目
2、路由信息 
3、開始節點、結束節點
'''
nodeNum = 0 # 節點數目
routeNum = 0 # 路由數目
listRoute = [] # 臨時存儲輸入的路由信息
listNodeId = []# 臨時存儲節點id 

nodeIdStart = ''
nodeIdEnd = ''
dictRoute = {} # 解析后的路由信息
dictNode = {} # 節點信息
# 輸入節點數目、路由數目
strInput = input()
list0 = strInput.split(' ')
nodeNum = int(list0[0])
routeNum = int(list0[1])

# 輸入路由信息
for index in range(routeNum):
 strInput = input()
 listRoute.append(strInput)
 
# 輸入開始節點、結束節點
strInput = input()
list0 = strInput.split(' ')
nodeIdStart = list0[0]
nodeIdEnd = list0[1]

# 解析得到節點Id
listNodeId.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) 

# 初始化路由信息字典、節點信息字典
for nodeId in listNodeId:
 # 節點字典信息
 dictNode[nodeId] = [10000, '', False] # 最短距離、父節點、是否檢查過
 # 每個路由字典創建
 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()

'''
狄克斯特拉實現
'''
# 找到最短距離節點id
def 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)
 
# 打印結果
listRst = []
nodeId = nodeIdEnd
while 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])

測試用例及驗證

Case1
輸入:
6 4
1 2 2
1 3 4
2 5 3
5 6 2
2 6

輸出:

Case2
輸入:
4 5
S A 6
S B 2
B A 3
A E 1
B E 5
S E

輸出:

Case3(找不到終點)
輸入:
6 6
S A 2
S B 1
A C 4
A B 1
B D 2
C D 3
S End

輸出:

Case4
輸入:
6 8
S A 5
S B 1
A C 1
A B 1
B D 5
C D 1
D End 1
C End 3
S End

輸出:

以上就是python實現狄克斯特拉算法的詳細內容,更多關于python狄克斯特拉的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python常用外部指令執行代碼實例
  • Python 讀取用戶指令和格式化打印實現解析
  • 如何安裝并使用conda指令管理python環境
  • python執行CMD指令,并獲取返回的方法
  • Python機器學習之KNN近鄰算法
  • Python機器學習算法之決策樹算法的實現與優缺點
  • 用Python給圖像算法做個簡單應用界面
  • Python實現七大查找算法的示例代碼
  • Python查找算法之插補查找算法的實現
  • python使用ProjectQ生成量子算法指令集

標簽:安慶 西安 錦州 股票 天水 日照 白城 隨州

巨人網絡通訊聲明:本文標題《python實現狄克斯特拉算法》,本文關鍵詞  python,實現,狄克,斯特拉,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python實現狄克斯特拉算法》相關的同類信息!
  • 本頁收集關于python實現狄克斯特拉算法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 阆中市| 获嘉县| 宝丰县| 宁陕县| 贵港市| 永和县| 巫溪县| 呈贡县| 砚山县| 余干县| 基隆市| 海口市| 白朗县| 禹城市| 莫力| 乐清市| 樟树市| 砀山县| 乐山市| 镇康县| 岳阳市| 长沙市| 栾川县| 宝丰县| 桐柏县| 通州市| 宁阳县| 徐汇区| 武安市| 全椒县| 信丰县| 陆良县| 威宁| 杨浦区| 含山县| 阿城市| 股票| 抚宁县| 安溪县| 寿光市| 登封市|