Skip to content

Commit 2502f76

Browse files
committed
[BOJ]#1238. 파티/골드3/힌트
https://www.acmicpc.net/problem/1238
1 parent 4eac461 commit 2502f76

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

Hongjoo/백준/파티.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
"""
2+
3+
https://www.acmicpc.net/problem/1238
4+
5+
goal : 각 N 개의 마을에서 X (랜덤)을 왕복하는 최단 거리 계산 -> 최대값 반환
6+
- 조건
7+
1. 단방향 M개의 길 : root
8+
2. 왕복 최단 거리 고려
9+
(1) 개별 N 개 -> X 최단 거리
10+
(2) X -> 개별 N 개 최단 거리
11+
의 총합 중 최대값
12+
13+
3. 왕복 길은 같아도, 달라도 상관 없음 -> 단방향이라 짜피 다른 루트 사용
14+
15+
- 유형 : 풀이 2가지 있음
16+
1. 다익스트라
17+
2 .플로이드 워샬
18+
19+
FLOW
20+
(1) 개별 N 개 -> X 최단 거리
21+
(2) X -> 개별 N 개 최단 거리
22+
23+
"""
24+
import sys
25+
import heapq
26+
# 1. 인접 리스트 field 만들기 (단방향)
27+
input = sys.stdin.readline
28+
INF = int(1e9) #1<=Time<=100
29+
N , M , start_town = map(int , input().split()) # 시작 note
30+
# 각 road (edge)와 Time 정복가 담김 리스트 만들기
31+
field = [[] for _ in range(N+1) ] # idx : 1~ N+1
32+
#무한으로 최단 거리 테이블 초기화
33+
to_X_distance = [ [INF for _ in range(N+1)] for k in range(N+1)]
34+
# 1-2. 모든 road 및 time 정보 받기
35+
36+
for m in range(M) :
37+
start , end , time = map(int, input().split())
38+
field[start].append((end, time))
39+
40+
41+
# 다익스트라
42+
def dijkstra(start , distance ) :
43+
q = [] # 우선순위 큐
44+
#1. 시작 노드에 대해 최단경로 = 0 , 큐 삽입(시간 = 0 , 노드)
45+
heapq.heappush(q , (0,start))
46+
distance[start] = 0
47+
#2. q가 비어 있기 전까지
48+
while q :
49+
# 가장 최단 거리 짧은 노드에 대한 정보 추출
50+
time , now = heapq.heappop(q) # A -> now(중간)
51+
# 현재 노드가 이미 처리 = 방문 여부 확인
52+
if distance[now] < time :
53+
continue
54+
# 현재 노드와 연결된 다른 인접 노드 확인
55+
for near_road , near_time in field[now] :
56+
duration = near_time + time # A -> now -> B
57+
#기존 방법 보다 현재 노드 경유해서 갈때 시간이 적게 걸릴때
58+
# 큐 삽입 & 최단거리 테이블 업데이트
59+
if duration < distance[near_road] :
60+
distance[near_road] = duration # 업데이트
61+
heapq.heappush(q , (duration , near_road)) # 큐에 넣기
62+
63+
return distance
64+
65+
# N-1 번 다익스트라 수행
66+
for i in range(1,N+1) :
67+
to_X_distance[i] = dijkstra(i,to_X_distance[i] )
68+
69+
# 1. X -> N 돌어감
70+
# go_X_distance = to_X_distance[start_town]
71+
72+
# 2. N ->X 로 출발
73+
result = [0 for _ in range(N+1)]
74+
for town in range(1,N+1):
75+
result[town] = to_X_distance[town][start_town] + to_X_distance[start_town][town] # {twon -> x} + {x-> town} : 각 마을별 왕복 최단 시간
76+
77+
print(max(result))

0 commit comments

Comments
 (0)