15971 두 로봇

정민용·2023년 5월 31일
0

백준

목록 보기
251/286

문제

2018년 강원도에서 새로운 동굴이 발견되었다. 이 동굴에는 총 N개의 넓은 방이 존재하며 좁은 통로로 서로 연결되어 있는 것으로 밝혀졌다. N개의 방은 1번부터 N번까지의 번호를 붙여 1번 방, 2번 방, …, N번 방으로 부른다. 통로는 정확히 N-1개가 발견되었는데, 각각 서로 다른 두 방 사이를 연결시켜 주며 중간에 다른 통로와 이어지는 경우는 없다고 한다. 또한 이 통로들을 이용하여 임의의 두 방 사이를 이동하는 것이 가능하며, 임의의 두 방 사이를 이동할 때 같은 통로를 두 번 이상 지나지 않는 경로는 유일한 것으로 밝혀졌다.

새로 발견된 동굴을 조사하기 위해 동굴 탐사 로봇 두 대를 이용하기로 하였다. 두 로봇은 어떤 시점이 되면 각자가 획득한 정보를 공유하기 위해 통신을 해야 한다. 두 로봇이 서로 통신을 하기 위해서는 동굴 내의 같은 통로 위에 위치해야만 한다. 참고로 임의의 통로의 양 끝에 위치한 두 방들도 그 통로 위에 위치해 있다고 간주한다.

<그림 1> 동굴 내부를 간략히 표현한 그림

<그림 1>은 방이 9개인 동굴 내부를 간략하게 나타낸 예이다. <그림 1>에서 방은 원으로 표현되어 있으며 원 안의 수는 방 번호이다. 8개의 통로는 두 원 사이의 선분으로 표시되어 있으며 그 위의 정수 값이 통로의 길이이다. 예를 들어, 5번 방과 9번 방 사이에 길이가 6 인 통로가 있음을 알 수 있다. 만약 두 로봇이 1번 방과 9번 방에 위치해 있다면, 각각 2번 방과 5번 방으로 이동한 후 통신할 수 있으며 이때 이동한 거리의 합은 14로 최소이다.

동굴 내의 통로에 대한 정보와 두 로봇의 현재 위치가 입력으로 주어질 때, 서로 통신하기 위해 이동해야 하는 거리의 합의 최솟값을 계산하는 프로그램을 작성하시오.

동굴의 각 통로는 양 끝에 위치한 두 방의 번호와 그 길이로 주어진다. 두 로봇의 위치는 방 번호로 주어진다.

# 15971
import sys
input = lambda: sys.stdin.readline().strip()

from collections import deque

# 1. 로봇 1, 로봇 2 이동 가능 지역 거리 구하기
# 2. 1~n까지 돌며 해당 번호를 로봇 1이 이동하고, 연결된 곳 까지 로봇 2가 이동해 거리 구하기

n, first, second = map(int, input().split())
graph = []
for _ in range(n+1):
    graph.append([])
for _ in range(n-1):
    s, e, v = map(int, input().split())
    graph[s].append((e, v))
    graph[e].append((s, v))
for g in graph:
    g.sort()
    
robot1 = [-1] * (n+1)
robot2 = [-1] * (n+1)

def move_robot(robot, start):
    global n, first, second, graph
    queue = deque()
    queue.append(start)
    robot[start] = 0
    
    while queue:
        x = queue.popleft()
        
        for g, v in graph[x]:
            if g == first or g == second:
                continue
            if robot[g] == -1 or robot[x] + v < robot[g]:
                robot[g] = robot[x] + v
                queue.append(g)
                
    return robot


# 로봇 1의 시작 위치와 로봇 2의 시작 위치가 같다면 통신 가능
if n == 1 or first == second:
    print("0")
    exit(0)

robot1 = move_robot(robot1, first)
robot2 = move_robot(robot2, second)

min_dist = 10**9
for x in range(1, n+1):
    for y, v in graph[x]:
        if robot1[x] == -1 or robot2[y] == -1:
            continue
            
        dist = robot1[x] + robot2[y]
        min_dist = min(min_dist, dist)
        
print(min_dist)

백준 15971 두 로봇

0개의 댓글