2022. 6. 23. 12:54ㆍ알고리즘/최단경로
문제
$N$개의 땅 중에서 한 곳에 자취를 하려고 집을 알아보고 있다. 세 명의 친구 $A$, $B$, $C$가 있는데 이 친구들의 살고 있는 집으로부터 가장 먼 곳에 집을 구하려고 한다.
이때, 가장 먼 곳은 선택할 집에서 거리가 가장 가까운 친구의 집까지의 거리를 기준으로 거리가 가장 먼 곳을 의미한다.
예를 들어, $X$ 위치에 있는 집에서 친구 $A$, $B$, $C$의 집까지의 거리가 각각 3, 5, 4이라 가정하고 $Y$ 위치에 있는 집에서 친구 $A$, $B$, $C$의 집까지의 거리가 각각 5, 7, 2라고 하자.
이때, 친구들의 집으로부터 땅 $X$와 땅 $Y$ 중 더 먼 곳은 $X$ 위치에 있는 집이 된다. 왜냐하면 $X$에서 가장 가까운 친구의 집까지의 거리는 3이고, $Y$에서는 $2$이기 때문이다.
친구들이 살고 있는 집으로부터 가장 먼 곳을 구해보자.
입력
첫번째 줄에 자취할 땅 후보의 개수 $N$이 주어진다.
2번째 줄에는 친구 $A$, $B$, $C$가 사는 위치가 공백으로 구분되어 주어진다. 이때 친구들은 $N$개의 땅 중 하나에 사는 것을 보장한다. (같은 위치에서 살 수 있다.)
3번째 줄에는 땅과 땅 사이를 잇는 도로의 개수 $M$이 주어진다.
그 다음줄부터 $M + 3$번째 줄까지 땅 $D$, 땅 $E$, 땅 $D$와 땅 $E$와 사이를 연결하는 도로의 길이 $L$이 공백으로 구분되어 주어진다. 이 도로는 양뱡항 통행이 가능하다.
출력
친구들이 살고 있는 집으로부터 가장 먼 곳의 땅 번호를 출력한다. 만약 가장 먼 곳이 여러 곳이라면 번호가 가장 작은 땅의 번호를 출력한다.
제한
- $ 1 ≤ N ≤ 100,000$
- $N - 1 ≤ M ≤ 500,000$
- $1 ≤ A, B, C, D, E ≤ N$
- $1 ≤ L ≤ 10,000$
예제 입력 1
6 1 2 5 8 1 2 1 2 3 4 1 4 2 2 5 3 1 6 5 5 6 2 3 4 2 4 5 6
예제 출력 1
3
접근 방법
- a, b, c에서 다익스트라를 사용해 가장 먼 곳을 구한 뒤, 가장 먼 곳의 땅 번호를 출력한다.
코드
# https://www.acmicpc.net/problem/22865
# 접근 방법
# a, b, c에서 다익스트라를 사용해 가장 먼 곳을 구한 뒤, 가장 먼 곳의 땅 번호를 출력한다.
def dijkstra(start):
distance[start] = 0
h = []
heapq.heappush(h, [0, start])
while h:
dist, now = heapq.heappop(h)
if dist > distance[now]:
continue
for x in graph[now]:
cost = dist + x[1]
if cost < distance[x[0]]:
distance[x[0]] = cost
heapq.heappush(h, [cost, x[0]])
import sys, heapq
input = sys.stdin.readline
n = int(input())
a, b, c = map(int ,input().split())
m = int(input())
graph = [[] for _ in range(n+1)]
for _ in range(m):
d, e, l = map(int ,input().split())
graph[d].append([e, l])
graph[e].append([d, l])
INF = 1e10
totalDist = [INF for _ in range(n+1)] # total, min
for i, x in enumerate([a, b, c]):
distance = [INF for _ in range(n+1)]
dijkstra(x)
for j in range(1, n+1):
totalDist[j] = min(totalDist[j], distance[j])
result = 1
for i in range(2, n+1):
if totalDist[result] < totalDist[i]:
result = i
print(result)
'알고리즘 > 최단경로' 카테고리의 다른 글
백준 온라인 저지, 최단경로 / 5972번: 택배배송 (파이썬 / 백준 골드문제) (0) | 2022.05.16 |
---|---|
백준 온라인 저지, 최단경로 / 14630번: 변신로봇 (파이썬 / 백준 골드문제) (0) | 2022.05.13 |
백준 온라인 저지, 최단경로 / 1600번: 말이되고픈원숭이 (파이썬 / , 백준 골드문제) (0) | 2022.04.06 |
백준 온라인 저지, 최단경로 / 9694번: 무엇을아느냐가아니라누구를아느냐가문제다 (파이썬 / , 백준 골드문제) (0) | 2022.02.02 |
백준 온라인 저지, 최단경로 / 11779번: 최소비용구하기2 (파이썬 / , 백준 골드문제) (0) | 2022.01.02 |