Thief of Wealth
Published 2020. 9. 24. 00:16
1238 파티 개발/알고리즘

www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어�

www.acmicpc.net

 

 

다익스트라의 응용이다.

 

N이 1000, M이 10000이므로 다익스트라를 사용해도 충분하다.

 

목적지 X에 갔다가 다시 되돌아와야하므로, 각 노드가 출발점인 경우에서 X까지의 최소거리를 저장하고

X가 목적지 일때 다른 곳 모두의 최소거리의 각각의 합의 최대값을 출력하면 된다.

 

import sys
import heapq
input = sys.stdin.readline
N, M, X = map(int, input().split(" "))
lines = dict()
for i in range(N+1):
  lines[i] = []

for _ in range(M):
  start,end,weight = map(int, input().split(" "))
  lines[start].append( (end, weight) )

# 각각의 모든 노드가 시작점일때의 다익스트라 distance
all_distances = dict()
for i in range(N+1):
  all_distances[i] = None

def dijkstra():
  global N
  global all_distances
  global lines
  global X
  INF = int(1e9)
  

  for start in range(1,N+1):
    distance = [INF] * (N+1)
    distance[start] = 0
    visited = [False] * (N+1)
    q = [] # [(weight, destination)]

    heapq.heappush(q, (0, start))

    while( len(q) > 0 ):
      smallest_dist, smallest_node = heapq.heappop(q)
      visited[smallest_node] = True # 방문처리
      for node in lines[smallest_node]:
        dest, weight = node

        if( visited[dest] == True ): 
          continue
        
        if( (smallest_dist + weight) < distance[dest]):
          distance[dest] = smallest_dist + weight
          heapq.heappush(q, (distance[dest], dest))


    all_distances[start] = list(distance)

  # X 입장에서 모든 경로로 가는 최단거리
  ans = []
  for i in range(1, N+1):
    
    a = all_distances[i][X] # i입장에서 X까지 최단거리
    b = all_distances[X][i] # X입장에서 i까지 최단거리
    ans.append(a+b)

  return max(ans)


print(dijkstra())

'개발 > 알고리즘' 카테고리의 다른 글

11727 2xn 타일링 2  (0) 2020.09.25
1261 알고스팟  (0) 2020.09.24
  (0) 2020.09.22
다익스트라 알고리즘  (0) 2020.09.21
1920 수찾기  (0) 2020.09.19
profile on loading

Loading...