Dijsktra算法貪婪法python實現

Dijsktra算法貪婪法python實現

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pdb


# Dijsktra算法
def update(a,b, nodepair, G, n):
    # 函數實現代碼開始
    # 請在其中寫入你的代碼
    if b == 0:
        return nodepair
    nodepair[b][0] = a
    nodepair[b][1] = G[a][b] + nodepair[a][1]
    # 函數實現代碼結束
    return nodepair


def dijkstra(G, n):
    INF = 100000
    visit = [-1] * n  # 遍歷情況記錄數組

    nodepair = [[-1, INF] for i in range(n)]  # 節點伴隨二元數組 第一個表示前一個索引preIndex,第二個表示距離

    # 先取第一個節點
    visit[0] = 1
    nodepair[0][1] = 0
    print(0, nodepair[0])  # 打印第一個節點
    # 更新節點伴隨二元數組
    nodepair = update(0,0, nodepair, G, n)
    # 函數實現代碼開始
    # 請在其中寫入你的代碼
    for key in range(1,n):
        tmp = INF
        for key1 in range(n):
            for key2 in range(n):
                if visit[key1]==1 and visit[key2]==-1:
                    if G[key1][key2] != 0:
                        if G[key1][key2]+nodepair[key1][1] < tmp:
                            a = key1
                            b = key2
                            tmp = G[key1][key2]
        visit[b] = 1
        nodepair = update(a,b, nodepair, G, n)
        print(b, nodepair[b])
    # 函數實現代碼結束
    return nodepair


if __name__ == '__main__':
    Glist = input().split('-')
    G = []
    for item in Glist:
        row = item.split(',')
        g = [int(i) for i in row]
        G.append(g)
    n = len(G)
    dijkstra(G, n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章