迪杰斯特拉

# coding=utf-8

import heapq
import math

DATA = {"data":
            {"node": [{"y": 390, "x": 2550, "id": 1},
                      {"y": 2430, "x": 4530, "id": 2},
                      {"y": 390, "x": 6530, "id": 3},
                      {"y": -1620, "x": 4530, "id": 4},
                      {"y": 410, "x": 530, "id": 5},
                      {"y": 390, "x": 8520, "id": 6},
                      {"y": 4420, "x": 4530, "id": 7},
                      {"y": -3600, "x": 4530, "id": 8},
                      {"y": 3410, "x": 9540, "id": 9},
                      {"y": -2600, "x": 9540, "id": 10}],
             "edge": [{"id": 1, "s_node": 1, "e_node": 2, "cost": 2842.8899999999999},
                      {"id": 2, "s_node": 2, "e_node": 3, "cost": 2856.8499999999999},
                      {"id": 3, "s_node": 3, "e_node": 4, "cost": 2835.5100000000002},
                      {"id": 4, "s_node": 4, "e_node": 1, "cost": 2821.4400000000001},
                      {"id": 5, "s_node": 1, "e_node": 4, "cost": 2821.4400000000001},
                      {"id": 6, "s_node": 4, "e_node": 3, "cost": 2835.5100000000002},
                      {"id": 7, "s_node": 3, "e_node": 2, "cost": 2856.8499999999999},
                      {"id": 8, "s_node": 2, "e_node": 1, "cost": 2842.8899999999999},
                      {"id": 9, "s_node": 1, "e_node": 5, "cost": 2020.0999999999999},
                      {"id": 10, "s_node": 5, "e_node": 1, "cost": 2020.0999999999999},
                      {"id": 11, "s_node": 3, "e_node": 6, "cost": 1990},
                      {"id": 12, "s_node": 6, "e_node": 3, "cost": 1990},
                      {"id": 15, "s_node": 5, "e_node": 2, "cost": 4481.1199999999999},
                      {"id": 16, "s_node": 2, "e_node": 6, "cost": 4481.2600000000002},
                      {"id": 17, "s_node": 6, "e_node": 4, "cost": 4467.6800000000003},
                      {"id": 18, "s_node": 4, "e_node": 5, "cost": 4485.6300000000001},
                      {"id": 19, "s_node": 2, "e_node": 7, "cost": 1990},
                      {"id": 20, "s_node": 7, "e_node": 2, "cost": 1990},
                      {"id": 21, "s_node": 4, "e_node": 8, "cost": 1980},
                      {"id": 22, "s_node": 8, "e_node": 4, "cost": 1980},
                      {"id": 23, "s_node": 3, "e_node": 9, "cost": 4263.8599999999997},
                      {"id": 24, "s_node": 9, "e_node": 3, "cost": 4263.8599999999997},
                      {"id": 25, "s_node": 3, "e_node": 10, "cost": 4242.6599999999999},
                      {"id": 26, "s_node": 10, "e_node": 3, "cost": 4242.6599999999999}]}}


def Vertex(edge,node):
    li0 = []
    parent=[]
    for i in range(len(node)):
        li0.append([])
        try:
            for j in range(len(edge)):
                if i + 1 == edge[j]["s_node"]:
                    li0[i].append(edge[j]["e_node"])
        except Exception as e:
            pass
    num=0
    for i in li0:
        num+=1
        for j in i:
            # ele=str(num)+str(j)
            ele=tuple([num,j])
            parent.append(ele)
    return li0,parent

def Dist(edge):
    li1 = []
    for i in range(len(node)):
        li1.append([])
        try:
            for j in range(len(edge)):
                if i + 1 == edge[j]["s_node"]:
                    li1[i].append(edge[j]["cost"])
        except Exception as e:
            pass
    return li1

def Allgraph(li0, li1):
    allgraph = []
    graph = {}
    for n in range(1, len(node)+1):
        graph[n] = {}
        nn = n - 1
        e1_node = li0[nn]
        for i in range(len(e1_node)):
            graph[n][e1_node[i]] = li1[nn][i]
    allgraph.append(graph)
    print('每个顶点所能达到的其他顶点和对应的距离:', allgraph)
    return allgraph


def init_distance(graph, s):
    distance = {s: 0}
    for vertex in graph:
        if vertex != s:
            distance[vertex] = 999999999999999999999999999999
    # print('初始距离:', distance)
    return distance


def dijkstra(graph, s,path):
    pqueue = []
    heapq.heappush(pqueue, (0, s))
    seen = set()
    parent = {s: None}
    distance = init_distance(graph, s)
    seen.add(s)
    while len(pqueue) > 0:
        pair = heapq.heappop(pqueue)
        dist = pair[0]
        vertex = pair[1]
        nodes = graph[vertex].keys()
        # print('当前顶点%s' % vertex, '可到达的点:', nodes)
        for w in nodes:
            if w !=s:
                # 寻找w顶点到终点的最短距离
                # print('尝试找到', w, '到终点更短的距离')
                path1=tuple([w,vertex])
                if path1 in path:
                    if dist + graph[vertex][w] < distance[w]:
                        heapq.heappush(pqueue, (dist + graph[vertex][w], w))
                        # w到终点最短路径的父顶点
                        parent[w] = vertex
                        # w 顶点到终点最短的距离
                        distance[w] = dist + graph[vertex][w]
                else:
                    for i in path:
                        if i[1] ==vertex:
                            w=i[0]
                            if dist + graph[w][vertex] < distance[w]:
                                heapq.heappush(pqueue, (dist + graph[w][vertex], w))
                                parent[w] = vertex
                                distance[w] = dist + graph[w][vertex]
    return parent, distance


if __name__ == '__main__':
    start = int(input('起点:'))
    end = int(input('终点:'))
    edge = DATA['data']['edge']
    node = DATA['data']['node']
    allgraph = Allgraph(Vertex(edge,node)[0],Dist(edge))
    parent_dict, distance_dict = dijkstra(allgraph[0], end,Vertex(edge,node)[1])
    print('最短距离:', distance_dict[start])
    path = []
    path.append(start)
    while parent_dict[start]:
        path.append(parent_dict[start])
        start = parent_dict[start]
    print('最短路径:', path)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值