728x90
https://www.acmicpc.net/problem/1238
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
다익스트라를 여러 번 사용해서 푸는 문제 같지만 입력받은 가중치를 사용해 X -> 다른 노드 의 다익스트라와 가중치의 방향을 반전시켜 X -> 다른 노드의 다익스트라를 더한 값을 비교하면 된다. 가중치의 방향을 반전시키면 다른 노드에서 X 로 오는 거리를 구할 수 있기 때문이다.
import heapq
def solution(N, M, X, data_list):
# 데이터 정리
clean_data = [[] for _ in range(N+1)]
# 방향을 바꾼 데이터
reversed_data = [[] for _ in range(N+1)]
for start, end, dist in data_list:
clean_data[start].append([dist, end])
reversed_data[end].append([dist, start])
# 파티 지점에서 다른 지점까지의 거리
return_list = dijkstra(X, clean_data, N)
# 방향을 바꾼 데이터로 구하면 다른 지점에서 파티장소로 오는 거리
to_list = dijkstra(X, reversed_data, N)
# 가장 긴 거리 출력
max_dist = max([return_list[n]+to_list[n] for n in range(1, N+1)])
return max_dist
def dijkstra(start, clean_data, N):
# 문제상 최댓값
inf = 100000
# 거리
dist_list = [inf for _ in range(N+1)]
dist_list[start] = 0
# 큐
hq = [[0, start]]
while True:
# 큐가 비면 끝
if not hq:
return dist_list
# 누적 거리, 현재 노드
dist, now_node = heapq.heappop(hq)
# 누적 거리가 최소 거리보다 길면 패스
if dist > dist_list[now_node]:
continue
# 이동 가능 거리 탐색
for add_dist, next_node in clean_data[now_node]:
# 다음 누적 거리
next_dist = dist + add_dist
# 저장된 최소거리보다 누적거리가 더 짧으면 최신화
if next_dist < dist_list[next_node]:
dist_list[next_node] = next_dist
# 큐에 추가
heapq.heappush(hq, [next_dist, next_node])
N, M, X = map(int, input().split())
data_list = [list(map(int, input().split())) for _ in range(M)]
print(solution(N, M, X, data_list))
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 1005 <ACM Craft> Python (0) | 2023.11.15 |
---|---|
백준 1753 <최단경로> Python (1) | 2023.11.14 |
백준 1753 <최단경로> Python (1) | 2023.11.14 |
백준 11725 <트리의 부모 찾기> Python (1) | 2023.11.13 |
백준 1991 <트리 순회> Python (0) | 2023.11.13 |