코드

import heapq
n, m, x = map(int, input().split())
INF = float('inf')

graph = [[] for _ in range(n+1)]

# 단방향이므로 graph에 값을 한 번만 넣어줌
for _ in range(m):
    a, b, c = map(int, input().split())
    graph[a].append((b, c))
    
# 다익스트라 구현
def dijkstra(start):
    
    q = []
    
    # 각 학생들마다 소요 시간을 체크할 것이므로
    # 학생들마다의 dist_table이 필요함
    # 함수의 반환값으로 dist_table을 사용하기 위해
    # 함수 안에서 선언해줌
    dist_table = [INF for _ in range(n+1)]
    
    heapq.heappush(q, (0, start))
    dist_table[start] = 0
    
    while q:
        w, v = heapq.heappop(q)
        
        if w > dist_table[v]:
            continue
            
        for i in graph[v]:
            cost = w + i[1]
            
            if cost < dist_table[i[0]]:
                dist_table[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))
                
    return dist_table

# 최종 정답
result = -INF

for i in range(1, n+1):
    
    # x -> x는 의미 없으므로 반복 제외
    if i == x:
        continue
        
    # 왕복 거리를 구하므로 (i -> x) + (x -> i)인 경우를 계산하여
    # result와 비교한 후, 가장 큰 값을 result로 최종 선택
    result = max(result, (dijkstra(i)[x] + dijkstra(x)[i]))
    
print(result)    

문제 해설

다익스트라 알고리즘.

개인적으로 가장 자신있는 알고리즘 유형 중 하나이다. 처음에 정말 이해가 안 가서 죽어라 연습한 보람이 느껴지는 유형 ㅎㅎ…

여타 다익스트라 문제들과 마찬가지의 로직으로 풀 수 있다. 단, 이 문제의 경우 단방향으로 주어졌을 때의 왕복 소요 시간이 가장 큰 경우를 구하라 했으므로, 최단 거리 테이블 별 학생의 도착 시간과 도착 장소에서 학생의 집까지의 소요 시간을 따로 구하여 더해주는 방식으로 풀면 간단하게 해결할 수 있다. (양방향이 아니기 때문에 x2를 하면 안됨)

기초 알고리즘 자체를 완벽히 구현할 수 있다면, 간단하게 나오는 경우 정말 쉽게 해결할 수 있는 문제인 것 같다. 이것도 꾸준한 연습의 결과라고 생각한다. 자만하지 않고 더 많은 유형의 문제를 시도해봐야겠다.

댓글남기기