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

python矩陣/字典實(shí)現(xiàn)最短路徑算法

 更新時(shí)間:2019年01月17日 15:48:21   作者:your_answer  
這篇文章主要為大家詳細(xì)介紹了python矩陣/字典實(shí)現(xiàn)最短路徑算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言:好像感覺(jué)各種博客的最短路徑python實(shí)現(xiàn)都花里胡哨的?輸出不明顯,唉,可能是因?yàn)椴幌胱x別人的代碼吧(明明自己學(xué)過(guò)離散)。然后可能有些人是用字典實(shí)現(xiàn)的?的確字典的話,比較省空間。改天,也用字典試下。先貼個(gè)圖吧。

然后再貼代碼:

_=inf=999999#inf
 
def Dijkstra_all_minpath(start,matrix):
 length=len(matrix)#該圖的節(jié)點(diǎn)數(shù)
 path_array=[]
 temp_array=[]
 path_array.extend(matrix[start])#深復(fù)制
 temp_array.extend(matrix[start])#深復(fù)制
 temp_array[start] = inf#臨時(shí)數(shù)組會(huì)把處理過(guò)的節(jié)點(diǎn)的值變成inf,表示不是最小權(quán)值的節(jié)點(diǎn)了
 already_traversal=[start]#start已處理
 path_parent=[start]*length#用于畫路徑,記錄此路徑中該節(jié)點(diǎn)的父節(jié)點(diǎn)
 while(len(already_traversal)<length):
  i= temp_array.index(min(temp_array))#找最小權(quán)值的節(jié)點(diǎn)的坐標(biāo)
  temp_array[i]=inf
  path=[]#用于畫路徑
  path.append(str(i))
  k=i
  while(path_parent[k]!=start):#找該節(jié)點(diǎn)的父節(jié)點(diǎn)添加到path,直到父節(jié)點(diǎn)是start
   path.append(str(path_parent[k]))
   k=path_parent[k]
  path.append(str(start))
  path.reverse()#path反序產(chǎn)生路徑
  print(str(i)+':','->'.join(path))#打印路徑
  already_traversal.append(i)#該索引已經(jīng)處理了
  for j in range(length):#這個(gè)不用多說(shuō)了吧
   if j not in already_traversal:
    if (path_array[i]+matrix[i][j])<path_array[j]:
     path_array[j] = temp_array[j] =path_array[i]+matrix[i][j]
     path_parent[j]=i#說(shuō)明父節(jié)點(diǎn)是i
 return path_array
 
#領(lǐng)接矩陣
adjacency_matrix=[[0,10,_,30,100],
     [10,0,50,_,_],
     [_,50,0,20,10],
     [30,_,20,0,60],
     [100,_,10,60,0]
     ]
print(Dijkstra_all_minpath(4,adjacency_matrix))

然后輸出:

2: 4->2
3: 4->2->3
0: 4->2->3->0
1: 4->2->1
[60, 60, 10, 30, 0]

主要是這樣輸出的話比較好看,然后這樣算是直接算一個(gè)點(diǎn)到所有點(diǎn)的最短路徑吧。那么寫下字典實(shí)現(xiàn)吧

def Dijkstra_all_minpath_for_graph(start,graph):
 inf = 999999 # inf
 length=len(graph)
 path_graph={k:inf for k in graph.keys()}
 already_traversal=set()
 path_graph[start]=0
 min_node=start#初始化最小權(quán)值點(diǎn)
 already_traversal.add(min_node)#把找到的最小節(jié)點(diǎn)添加進(jìn)去
 path_parent={k:start for k in graph.keys()}
 while(len(already_traversal)<=length):
  p = min_node
  if p!=start:
   path = []
   path.append(str(p))
   while (path_parent[p] != start):#找該節(jié)點(diǎn)的父節(jié)點(diǎn)添加到path,直到父節(jié)點(diǎn)是start
    path.append(str(path_parent[p]))
    p=path_parent[p]
   path.append(str(start))
   path.reverse()#反序
   print(str(min_node) + ':', '->'.join(path))#打印
  if(len(already_traversal)==length):break
  for k in path_graph.keys():#更新距離
   if k not in already_traversal:
    if k in graph[min_node].keys() and (path_graph[min_node]+graph[min_node][k])<path_graph[k]:
     path_graph[k]=path_graph[min_node]+graph[min_node][k]
     path_parent[k]=min_node
  min_value=inf
  for k in path_graph.keys():#找最小節(jié)點(diǎn)
   if k not in already_traversal:
    if path_graph[k]<min_value:
     min_node=k
     min_value=path_graph[k]
  already_traversal.add(min_node)#把找到最小節(jié)點(diǎn)添加進(jìn)去
 return path_graph
adjacency_graph={0:{1:10,3:30,4:100},
     1:{0:10,2:50},
     2:{1:50,3:20,4:10},
     3:{0:30,2:20,4:60},
     4:{0:100,2:10,3:60}}
print(Dijkstra_all_minpath_for_graph(4,adjacency_graph))

輸出:

2: 4->2
3: 4->2->3
0: 4->2->3->0
1: 4->2->1
{0: 60, 1: 60, 2: 10, 3: 30, 4: 0}

還行吧,有時(shí)間再看看networkx這個(gè)庫(kù)怎么說(shuō)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python不同格式打印九九乘法表示例

    Python不同格式打印九九乘法表示例

    大家好,本篇文章主要講的是Python不同格式打印九九乘法表示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下哦,方便下次瀏覽
    2021-12-12
  • Python+PyQt5來(lái)實(shí)現(xiàn)文件高速查找

    Python+PyQt5來(lái)實(shí)現(xiàn)文件高速查找

    這篇文章主要為大家詳細(xì)介紹了如何模擬Everything,即通過(guò)python+PyQt5來(lái)實(shí)現(xiàn)可視化文件的高速查找,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-07-07
  • 代碼詳解django中數(shù)據(jù)庫(kù)設(shè)置

    代碼詳解django中數(shù)據(jù)庫(kù)設(shè)置

    在本篇文章里小編給大家分享了關(guān)于django中數(shù)據(jù)庫(kù)設(shè)置的相關(guān)實(shí)例內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。
    2019-01-01
  • python中常用的九個(gè)語(yǔ)法技巧

    python中常用的九個(gè)語(yǔ)法技巧

    大家好,本篇文章主要講的是python中常用的九個(gè)語(yǔ)法技巧,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • python網(wǎng)絡(luò)編程示例(客戶端與服務(wù)端)

    python網(wǎng)絡(luò)編程示例(客戶端與服務(wù)端)

    這篇文章主要介紹了python網(wǎng)絡(luò)編程示例,提供了客戶端與服務(wù)端,需要的朋友可以參考下
    2014-04-04
  • 你知道怎么改進(jìn)Python 二分法和牛頓迭代法求算術(shù)平方根嗎

    你知道怎么改進(jìn)Python 二分法和牛頓迭代法求算術(shù)平方根嗎

    這篇文章主要介紹了Python編程實(shí)現(xiàn)二分法和牛頓迭代法求平方根代碼的改進(jìn),具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來(lái)幫助
    2021-08-08
  • Python實(shí)現(xiàn)消消樂(lè)小游戲

    Python實(shí)現(xiàn)消消樂(lè)小游戲

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)消消樂(lè)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python文件操作的方法

    Python文件操作的方法

    本文詳細(xì)講解了Python文件操作的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Python報(bào)錯(cuò)TypeError: ‘dict‘ object is not iterable的解決方法

    Python報(bào)錯(cuò)TypeError: ‘dict‘ object is not&

    在Python開(kāi)發(fā)的旅程中,報(bào)錯(cuò)信息就像是一個(gè)個(gè)路障,阻礙著我們前進(jìn)的步伐,而“TypeError: ‘dict’ object is not iterable”這個(gè)報(bào)錯(cuò),常常讓開(kāi)發(fā)者們陷入困惑,那么,這個(gè)報(bào)錯(cuò)究竟是怎么產(chǎn)生的呢?又該如何有效地解決它呢?讓我們一起深入探討,找到解決問(wèn)題的方法
    2024-10-10
  • 使用PyQtGraph繪制精美的股票行情K線圖的示例代碼

    使用PyQtGraph繪制精美的股票行情K線圖的示例代碼

    這篇文章主要介紹了使用PyQtGraph繪制精美的股票行情K線圖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

长沙县| 肇庆市| 淮滨县| 嘉义县| 四子王旗| 公安县| 靖江市| 称多县| 西和县| 阿克苏市| 疏附县| 龙南县| 绥宁县| 东阿县| 合山市| 长沙县| 包头市| 鄯善县| 马公市| 阿图什市| 库尔勒市| 宝应县| 吉木萨尔县| 湟中县| 宝坻区| 民乐县| 越西县| 平安县| 当阳市| 甘孜县| 集安市| 怀仁县| 华安县| 桓台县| 甘德县| 彩票| 义乌市| 吉林省| 香河县| 肥西县| 晴隆县|