力扣 2642. 设计可以求最短路径的图类 python AC

朴素dijkstra

class Graph:
    def __init__(self, n, edges):
        self.n = n
        self.INF = float('inf')
        self.matrix = [[self.INF] * n for _ in range(n)]
        for u, v, w in edges:
            self.matrix[u][v] = w

    def addEdge(self, edge):
        u, v, w = edge
        self.matrix[u][v] = w

    def shortestPath(self, node1, node2):
        distance = [self.INF] * self.n
        distance[node1] = 0
        vis = [False] * self.n
        step = self.n
        while False in vis and step > 0:
            step -= 1
            min_ind, min_val = self.INF, self.INF
            for ind in range(self.n):
                if distance[ind] < min_val and not vis[ind]:
                    min_ind, min_val = ind, distance[ind]
            if min_ind == self.INF:
                break
            vis[min_ind] = True
            for to_ind in range(self.n):
                distance[to_ind] = min(distance[to_ind], distance[min_ind] + self.matrix[min_ind][to_ind])
        return distance[node2] if distance[node2] != self.INF else -1

dijkstra+堆优化

from heapq import heappop, heappush


class Graph:
    def __init__(self, n, edges):
        self.n = n
        self.INF = float('inf')
        self.matrix = [[self.INF] * n for _ in range(n)]
        for u, v, w in edges:
            self.matrix[u][v] = w

    def addEdge(self, edge):
        u, v, w = edge
        self.matrix[u][v] = w

    def shortestPath(self, start, end):
        distance = [self.INF] * self.n
        distance[start] = 0
        q = [(0, start)]
        while q:
            dis, now = heappop(q)
            if now == end:
                return dis
            if dis > distance[now]:
                continue
            for to_ind in range(self.n):
                if distance[to_ind] > dis + self.matrix[now][to_ind]:
                    distance[to_ind] = dis + self.matrix[now][to_ind]
                    heappush(q, (distance[to_ind], to_ind))
        return -1

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值