[Programmers] P72413 합승 택시 요금

Question

Language: Python

특정 구간 까지는 같이 합승을 하고, 이후에는 각자의 도착지로 가는 데, 이때의 최소 경로를 구하는 문제이다.

시작 지점 S에서 중간 지점 T 까지 합승해서 가고, (1~T 까지의 경우에 대해서 반복 순회하면 된다.) 중간 지점 T에서 A의 목적지, T 지점에서 B의 목적지 까지 구하면 된다.

그러므로, 해당 문제는 ASSP(All Source Shortest Path)으로 구해도 되고, Dijkstra를 이용해서 풀이해도 되는 문제이다.

Solution 1

import heapq
from math import inf

def dijkstra(n,graph,start,end):
    visited=[False] * (n+1)
    distance=[inf] * (n+1)
    heap=[]
    
    distance[start]=0
    visited[start]=True    
    heapq.heappush(heap,(0,start))
    
    while heap:
        cost,vertex=heapq.heappop(heap)    
        
        if cost > distance[vertex]:
            continue
            
        visited[vertex]=True
        for adj_vertex,weight in graph[vertex]:
            temp=cost+weight
            if distance[adj_vertex] > temp:
                distance[adj_vertex]=temp
                heapq.heappush(heap,(temp,adj_vertex))
           
    return distance[end]
        
def solution(n, s, a, b, fares):
    answer = 0
    graph=[[] for _ in range(n+1)]
    
    for v1,v2,cost in fares:
        graph[v1].append((v2,cost))
        graph[v2].append((v1,cost))
    
    min_cost=inf
    
    for i in range(1,n+1):
        cost=dijkstra(n,graph,s,i) + dijkstra(n,graph,i,a) + dijkstra(n,graph,i,b)
        min_cost=min(min_cost,cost)
    
    answer=min_cost
    return answer

Solution 2

from math import inf

def floyd_warshall(n,graph):
    for a in range(1,n+1):
        graph[a][a]=0
    
    for k in range(1,n+1):
        for a in range(1,n+1):
            for b in range(1,n+1):
                cost=graph[a][k] + graph[k][b]
                if graph[a][b] > cost:
                    graph[a][b] = cost
        
def solution(n, s, a, b, fares):
    answer = 0
    graph=[[inf] * (n+1) for _ in range(n+1)]
    
    for v1,v2,cost in fares:
        graph[v1][v2]=cost
        graph[v2][v1]=cost
    
    floyd_warshall(n,graph)
    min_cost=inf
    
    for i in range(1,n+1):
        cost=graph[s][i] + graph[i][a] + graph[i][b]
        min_cost=min(min_cost,cost)
    
    answer=min_cost
    return answer

댓글남기기