蓝桥题库:小齐的GPS之争

用户登录icon-default.png?t=N7T8https://www.lanqiao.cn/problems/17527/learning/?page=1&first_category_id=1&name=%E5%B0%8F%E9%BD%90%E7%9A%84GPS

import heapq

class Edge:

        def __init__(self, to, weight):

                self.to = to

                self.weight = weight

        def __lt__(self, other):

                return self.weight < other.weight

maxn = 10003

inf = 1 << 29

N, M = map(int, input().split())

va = [[] for _ in range(maxn)]

vb = [[] for _ in range(maxn)]

v = [[] for _ in range(maxn)]

dist = [[inf] * maxn for _ in range(3)]

def dij(v, a, src):

        dist[a] = [inf] * maxn

        dist[a][src] = 0

        pq = []

        heapq.heappush(pq, Edge(src, 0))

        while pq:

                edge = heapq.heappop(pq)

                cur = edge.to

                dst = edge.weight

                if dst != dist[a][cur]:

                        continue

                for next_edge in v[cur]:

                        nxt = next_edge.to

                        c = next_edge.weight + dist[a][cur]

                        if c < dist[a][nxt]:

                                dist[a][nxt] = c

                                heapq.heappush(pq, Edge(nxt, dist[a][nxt]))

        return dist[a][N - 1]

for i in range(M):

        a, b, p, q = map(int, input().split())

        a -= 1

        b -= 1

        va[b].append(Edge(a, p))         

        vb[b].append(Edge(a, q))

dij(va, 0, N - 1)

dij(vb, 1, N - 1)

for cur in range(N):

        for j in range(len(va[cur])):

                nxt = va[cur][j].to

                c = 0

                dst1 = va[cur][j].weight

                dst2 = vb[cur][j].weight

                if dist[0][nxt] - dist[0][cur] != dst1:

                        c += 1

                if dist[1][nxt] - dist[1][cur] != dst2:

                        c += 1

                v[nxt].append(Edge(cur, c))

ans = dij(v, 2, 0)

print(ans)

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值