pta紧急救援pyhton版满分

import heapq
import sys

inf = float('inf')
def f():
    n, m, s, d = map(int, sys.stdin.readline().split())
    v = list(map(int, sys.stdin.readline().split()))
    g = [[inf]*n for _ in range(n)]
    dis = [inf for _ in range(n)]
    pre = [i for i in range(n)]
    vis = [False for _ in range(n)]
    cnt = [0 for _ in range(n)]
    sumv = [0 for _ in range(n)]
    sumv[s] = v[s]
    dis[s] = 0
    cnt[s] = 1
    for _ in range(m):
        a, b, c = map(int, sys.stdin.readline().split())
        g[a][b] = c
        g[b][a] = c
    h = []
    heapq.heappush(h,(0,s))
    while h:
        jl,node = heapq.heappop(h)
        if vis[node] == True:
            continue
        vis[node] = True
        for node2 in range(n):
            if vis[node2] == True:
                continue
            if dis[node] + g[node][node2] < dis[node2]:
                dis[node2] = dis[node] + g[node][node2]
                heapq.heappush(h,(dis[node2],node2))
                cnt[node2] = cnt[node]
                sumv[node2] = sumv[node] + v[node2]
                pre[node2] = node
            elif dis[node] + g[node][node2] == dis[node2]:
                cnt[node2] += cnt[node]
                if sumv[node] + v[node2] > sumv[node2]:
                    sumv[node2] = sumv[node] + v[node2]
                    pre[node2] = node
    print("%d %d"%(cnt[d], sumv[d]))
    path = []
    while d!=s:
        path.append(d)
        d=pre[d]
    path.append(s)
    path.reverse()
    print(*path)
f()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值