A,B 모두 택시를 타고 귀가하는데 소요되는 최저 택시 요금 구하기!
합승해서 이동할 수 있는 경로의 비용 ( together ) + 각각 혼자 택시타고 이동할 수 있는 경로의 비용 ( A + B )
만약, 처음부터 합승하지 않고 각자 이동하는 경우의 택시 요금이 낮다면, 합승하지 않아도 됨
s = 출발지점
a = A의 도착지점
b = B의 도착지점
fares 의 각 행 [c,d,f] → c지점과 d지점 사이의 예상 택시비
return → 택시비 최소 비용
다익스트라 , 플로이드 와샬 이용
각 경로와 비용을 저장할 배열 생성
합승하여 가는 경우 , 각자 집에 가는 경우, 한 사람 A 집 가는 중 다른 사람 B를 중간에 내려주는 경우
최종 비용
import heapq as hq
INF = int(1e9)
def dijkstra(distances, start, graph) :
queue = []
distances[start] = 0
hq.heappush(queue, (distances[start], start))
while queue:
current_distance, current = hq.heappop(queue)
if distances[current] < current_distance :
continue
for adj_node, next_distance in graph[current] :
cost = current_distance + next_distance
if cost < distances[adj_node] :
distances[adj_node] = cost
hq.heappush(queue,(distances[adj_node],adj_node))
def solution(n, s, a, b, fares):
answer = INF
graph = [[] for _ in range(n+1)]
for fare in fares :
x,y,cost = fare
graph[x].append((y,cost))
graph[y].append((x,cost)
distance = [INF]*(n+1)
dijkstra(distance,s,graph)
for i in range(1,n+1) :
route = [INF]*(n+1)
dijkstra(route,i,graph)
answer = min(answer, distance[i] + route[a] + route[b])
return answer
def solution(n, s, a, b, fares):
INF = int(1e9)
answer = INF
distance = [[INF] * (n + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
distance[i][i] = 0
for x, y, cost in fares:
distance[x][y] = distance[y][x] = cost
for k in range(1, n + 1):
for i in range(1, n + 1):
for j in range(1, n + 1):
if distance[i][j] > distance[i][k] + distance[k][j]:
distance[i][j] = distance[i][k] + distance[k][j]
for i in range(1, n + 1):
answer = min(answer, distance[s][i] + distance[i][a] + distance[i][b])
return answer
( 사용한 메소드, 라이브러리 등 원리 )
graph = [[] for _ in range(n+1)]
for fare in fares :
x,y,cost = fare
graph[x].append((y,cost))
graph[y].append((x,cost))
다익스트라는 최단 경로 알고리즘으로 특정 노드에서 시작해 모든 노드까지 도착할 수 있는 가장 짧은 경로
모든 거리를 무한대로 초기화 시킨 후 다익스트라 적용하여 s 지점에서 나머지 정점까지의 최단거리 구하기
distance = [INF]*(n+1)
dijkstra(distance,s,graph)
for i in range(1,n+1) :
route = [INF]*(n+1)
dijkstra(route,i,graph)
answer = min(answer, distance[i] + route[a] + route[b])
distance = [[INF] * (n + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
distance[i][i] = 0
for x, y, cost in fares:
distance[x][y] = distance[y][x] = cost
for k in range(1, n + 1):
for i in range(1, n + 1):
for j in range(1, n + 1):
if distance[i][j] > distance[i][k] + distance[k][j]:
distance[i][j] = distance[i][k] + distance[k][j]
for i in range(1, n + 1):
answer = min(answer, distance[s][i] + distance[i][a] + distance[i][b])