Cometin'

BOJ-18223 - Python

2021-03-03 at Algorithm category

V개의 정점, E개의 간선, 들려야할 정점 P가 주어진다. 1부터 V까지의 최단거리와 1부터 P를 들려 V에 도착하는 최단거리가 같을 시 "SAVE HIM"을, 다를 시 "GOOD BYE"를 출력하는 문제. 첫 번째 풀이는 플로이드 와샬 방법을 이용하여 모든 정점으로부터의 최단거리를 계산한 후, 1부터 V까지의 값과 1부터 P까지의 값 + P부터 V까지의 값을 비교하여 풀었으나 시간초과 결과를 받게 되었다. 두 번째 풀이는 INF와 heap을 사용하는 다익스트라를 구현하여 1부터의 최단거리들, P부터의 최단거리를 계산하여 위 공식을 대입해 풀었다.

# import sys
# INF = sys.maxsize
# input = sys.stdin.readline
#
# def floyd(graph):
#     for k in range(1, V+1):
#         graph[k][k] = 0
#         for i in range(1, V+1):
#             for j in range(1, V+1):
#                 graph[i][j] = min(graph[i][k] + graph[k][j], graph[i][j])
#
#
# V, E, P = map(int, input().split())
# graph = [[INF for _ in range(V+1)] for _ in range(V+1)]
#
# for _ in range(E):
#     s, e, w = map(int, input().split())
#     graph[s][e] = min(graph[s][e], w)
#     graph[e][s] = min(graph[e][s], w)
#
# floyd(graph)
# print("SAVE HIME" if graph[1][V] == graph[1][P] + graph[P][V] else "GOOD BYE")


import heapq
import sys
INF = sys.maxsize
input = sys.stdin.readline


def dijkstra(start):
    dist = [INF for _ in range(V+1)]
    dist[start] = 0

    q = []
    heapq.heappush(q, [0, start])

    while q:
        w, n = heapq.heappop(q)

        if dist[n] < w:
            continue

        for nn, tw in graph[n]:
            nw = w + tw
            if dist[nn] > nw:
                dist[nn] = nw
                heapq.heappush(q, [nw, nn])

    return dist

V, E, P = map(int, input().split())
graph = {i: [] for i in range(V+1)}
for _ in range(E):
    s, e, w = map(int, input().split())
    graph[s].append([e, w])
    graph[e].append([s, w])


dist = dijkstra(1)
dist_p = dijkstra(P)
print("SAVE HIM" if dist[V] == dist[P] + dist_p[V] else "GOOD BYE")

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.