最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)狄克斯特拉算法

 更新時(shí)間:2021年04月07日 11:39:28   作者:果然還是我比較shuai  
這篇文章主要介紹了python實(shí)現(xiàn)狄克斯特拉算法。想了解數(shù)據(jù)結(jié)構(gòu)和算法朋友可以參考下

數(shù)據(jù)結(jié)構(gòu)

1、路由信息

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)檢查的不計(jì)算在內(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、計(jì)算鄰居節(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 os
import 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 = [] # 臨時(shí)存儲(chǔ)輸入的路由信息
listNodeId = []# 臨時(shí)存儲(chǔ)節(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)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) 

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

測試用例及驗(yàn)證

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(找不到終點(diǎn))
輸入:
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實(shí)現(xiàn)狄克斯特拉算法的詳細(xì)內(nèi)容,更多關(guān)于python狄克斯特拉的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python使用Plotly繪圖工具繪制散點(diǎn)圖、線形圖

    python使用Plotly繪圖工具繪制散點(diǎn)圖、線形圖

    這篇文章主要為大家詳細(xì)介紹了python使用Plotly繪圖工具繪制散點(diǎn)圖、線形圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Pyinstaller打包工具的使用以及避坑

    Pyinstaller打包工具的使用以及避坑

    本文主要的是pyinstaller在windows下的基本使用和基礎(chǔ)避坑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python實(shí)現(xiàn)二維碼掃碼自動(dòng)登錄淘寶

    python實(shí)現(xiàn)二維碼掃碼自動(dòng)登錄淘寶

    最近做項(xiàng)目,需要用到自動(dòng)登錄淘寶,正好在學(xué)習(xí)python,整網(wǎng)絡(luò)爬蟲,所以就嘗試著寫一個(gè)腳本,自動(dòng)解決。有相同需求的小伙伴可以參考下
    2016-12-12
  • Flask 驗(yàn)證碼自動(dòng)生成的實(shí)現(xiàn)示例

    Flask 驗(yàn)證碼自動(dòng)生成的實(shí)現(xiàn)示例

    本文主要介紹了Flask 驗(yàn)證碼自動(dòng)生成的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Python使用numpy模塊實(shí)現(xiàn)矩陣和列表的連接操作方法

    Python使用numpy模塊實(shí)現(xiàn)矩陣和列表的連接操作方法

    今天小編就為大家分享一篇Python使用numpy模塊實(shí)現(xiàn)矩陣和列表的連接操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python3實(shí)現(xiàn)的判斷回文鏈表算法示例

    Python3實(shí)現(xiàn)的判斷回文鏈表算法示例

    這篇文章主要介紹了Python3實(shí)現(xiàn)的判斷回文鏈表算法,結(jié)合實(shí)例形式分析了Python3針對(duì)鏈表是否為回文鏈表進(jìn)行判斷的相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03
  • python檢查字符串是否是正確ISBN的方法

    python檢查字符串是否是正確ISBN的方法

    這篇文章主要介紹了python檢查字符串是否是正確ISBN的方法,涉及Python針對(duì)字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2015-07-07
  • Python?數(shù)據(jù)分析教程探索性數(shù)據(jù)分析

    Python?數(shù)據(jù)分析教程探索性數(shù)據(jù)分析

    這篇文章主要介紹了Python?數(shù)據(jù)分析教程探索性數(shù)據(jù)分析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Python入門教程(二十四)Python的迭代器

    Python入門教程(二十四)Python的迭代器

    這篇文章主要介紹了Python入門教程(二十四)Python的迭代器,Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04
  • Python如何在循環(huán)內(nèi)使用list.remove()

    Python如何在循環(huán)內(nèi)使用list.remove()

    這篇文章主要介紹了Python如何在循環(huán)內(nèi)使用list.remove(),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論

六枝特区| 安多县| 恭城| 宾川县| 琼中| 靖宇县| SHOW| 无锡市| 苏尼特左旗| 莱芜市| 通江县| 谷城县| 全椒县| 东乌| 邻水| 秭归县| 苍溪县| 孝昌县| 仙居县| 彭阳县| 新龙县| 安吉县| 阿拉尔市| 中江县| 嘉禾县| 翁牛特旗| 和硕县| 民权县| 离岛区| 平阳县| 同心县| 广州市| 贵南县| 海宁市| 衡东县| 和政县| 康保县| 禹州市| 鲁甸县| 基隆市| 浙江省|