aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc 035 d (python)

ダイクストラ法の問題
この問題は道路を片方向にしか通れないので、1からkまでの最短路とkから1までの最短路は別に求める必要がある。

import sys
input = sys.stdin.readline
n,m,t = map(int,input().split())
a = list(map(int,input().split()))
a = tuple(a)
ed = [[] for i in range(n)]
re = [[] for i in range(n)]
for i in range(m):
  x,y,z = map(int,input().split())
  ed[x-1].append([z,y-1])
  re[y-1].append([z,x-1])

import heapq
def dijkstra_heap(s,edge):
    #始点sから各頂点への最短距離
    d = [10**10] * n
    used = [True] * n
    d[s] = 0
    used[s] = False
    edgelist = []
    for e in edge[s]:
        heapq.heappush(edgelist,e)
    while len(edgelist):
        minedge = heapq.heappop(edgelist)
        if not used[minedge[1]]:
            continue
        v = minedge[1]
        d[v] = minedge[0]
        used[v] = False
        for e in edge[v]:
            if used[e[1]]:
                heapq.heappush(edgelist,[e[0]+d[v],e[1]])
    return d
  
chk = dijkstra_heap(0,ed)
cc = dijkstra_heap(0,re)
ans = a[0]*t
for i in range(1,n):
  p = (t-chk[i]-cc[i])*a[i]
  ans = max(ans,p)
print(ans)