목적지가 다른 2명이 같은 위치에서 택시를 탄다. 그리고 특정 지점에서 하차한 이후, 각자 서로 다른 택시를 타고 본인의 목적지에 도착한다. 이 때, 나올 수 있는 총 요금들 중 가장 작은 값을 구해야한다.
가중치가 있는 그래프에서 최단 거리(최소 요금)를 구하기 위해, 다익스트라 사용
A
와B
가 헤어지는 지점을 K라고 하면,
요금 = dijkstra(출발점, K) + dijkstra(K,A
의 도착지점) + dijkstra(K,B
의 도착지점)주어진 모든 지점(e.g. 출발점,
A
의 도착지점,B
의 도착지점, 그 외 나머지 지점들)을 하나씩 K에 대입하여 나온 요금들을 비교한다.
cost = INF
로 변경, solution()
의 for
문 안에 있는 if
문 삭제from heapq import heappop, heappush
INF = int(1e9)
graph = [[]]
def preprocess(n, fares):
global graph
graph = [[] for i in range(n+1)]
for fare in fares:
src, dst, cost = fare[0], fare[1], fare[2]
graph[src].append([dst, cost])
graph[dst].append([src, cost])
def dijkstra(src, dst):
global graph
n = len(graph)
table = [INF for i in range(n)]
table[src] = 0
pq = [[0, src]]
while pq:
w, x = heappop(pq)
if table[x] < w: continue
for item in graph[x]:
nx, ncost = item[0], item[1]
ncost += w
if ncost < table[nx]:
table[nx] = ncost
heappush(pq, [ncost, nx])
return table[dst]
def solution(n, s, a, b, fares):
preprocess(n, fares)
cost = INF
for i in range(1, n+1):
cost = min(cost, dijkstra(s, i) + dijkstra(i, a) + dijkstra(i, b))
return cost
from heapq import heappop, heappush
INF = int(1e9)
graph = [[]]
def preprocess(n, fares):
global graph
graph = [[] for i in range(n+1)]
for fare in fares:
src, dst, cost = fare[0], fare[1], fare[2]
graph[src].append([dst, cost])
graph[dst].append([src, cost])
def dijkstra(src, dst):
global graph
n = len(graph)
table = [INF for i in range(n)]
table[src] = 0
pq = [[0, src]]
while pq:
w, x = heappop(pq)
if table[x] < w: continue
for item in graph[x]:
nx, ncost = item[0], item[1]
ncost += w
if ncost < table[nx]:
table[nx] = ncost
heappush(pq, [ncost, nx])
return table[dst]
def solution(n, s, a, b, fares):
preprocess(n, fares)
cost = dijkstra(s, a) + dijkstra(s, b)
for i in range(1, n+1):
if s != i:
cost = min(cost, dijkstra(s, i) + dijkstra(i, a) + dijkstra(i, b))
return cost