dijkstra算法

'''
def dijsktra(n,m,edge,start,end):
    num = [[float('inf')]*(n+1) for i in range(n+1)]
    # 构造邻接矩阵
    for i ,j,k in edge:
        num[i][j] = k
    visit = [False]*(n+1)
    mindis = [float('inf')]*(n+1)
    mindis[start] = 0
    for i in range(1,n+1):
        mini = float('inf')
        cur = -1
        for j in range(1,n+1):
            if visit[j] == False and mindis[j]<mini:
                mini = mindis[j]
                cur = j
        if cur == -1:
            break
        visit[cur] = True

        for k in range(1,n+1):
            if visit[k]== False and num[cur][k] != float('inf') and num[cur][k]+mindis[cur]<mindis[k]:
                mindis[k] = num[cur][k] +mindis[cur]
    return -1 if mindis[end] == float('inf') else mindis[end]


n,m = map(int,input().split())
num = []
for i in range(m):
    num.append(list(map(int,input().split())))
print(dijsktra(n,m,num,1,n))
'''
import heapq
class Edge:
    def __init__(self,to,val):
        self.to = to
        self.val = val
def dijkstra(start,end,edge,n,m):
    grap = [[] for i in range(n+1)]
    for i,j,k in edge:
        grap[i].append(Edge(j,k))
    visit = [False]*(n+1)
    minDist = [float('inf')]*(n+1)
    hp = []
    heapq.heappush(hp,(0,start)) # 以第一个元素的大小进行压堆,默认小顶堆
    minDist[start] = 0
    while hp:
        cur_dist ,cur_node = heapq.heappop(hp) # 把当前距离最小的节点拿出来
        if visit[cur_node]:
            continue
        visit[cur_node] = True
        for a in grap[cur_node]:
            if visit[a.to] == False and cur_dist + a.val < minDist[a.to]:
                minDist[a.to] = cur_dist + a.val
                heapq.heappush(hp,(minDist[a.to],a.to)) # 存储到当前节点的最小距离
    return -1 if minDist[end] == float('inf') else minDist[end]


n,m = map(int,input().split())
edge = [tuple(map(int,input().split())) for i in range(m)]
start = 1
end = n
result = dijkstra(start,end,edge,n,m)
print(result)

47. 参加科学大会(第六期模拟笔试)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值