최소거리 배열 다 구해서 전부 더해준 다음 합 미니멈인 방번호 출력
다익스트라로 간단하게 풀었다.
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
from collections import defaultdict
# 각 친구들 위치에서 모든 방에 대해 최소거리 배열 출력.
def dijkstra(start):
global dp_dists
dp_dists = [float('inf')] * (N + 1)
heap = []
dp_dists[start] = 0
heappush(heap, [dp_dists[start], start])
while heap:
cur_dist, cur_node = heappop(heap)
if dp_dists[cur_node] < cur_dist:
continue
for next_node, next_dist in graph[cur_node]:
dist = next_dist + cur_dist
if dist < dp_dists[next_node]:
dp_dists[next_node] = dist
heappush(heap, [dist, next_node])
return dp_dists
# N개의 방(1~N번)
# M개의 통로(양방향), 가중치
# 친구 K명
for test in range(int(input())):
N,M = map(int,input().split())
graph = defaultdict(list)
for _ in range(M):
a,b,dist = map(int,input().split())
graph[a].append((b,dist))
graph[b].append((a,dist))
# 모든 친구들은 최단 경로를 이용해서 방으로 모일것임.
K = int(input())
friends_start = list(map(int,input().split()))
sum_dists = [0]*(N+1)
for start in friends_start:
dijkstra(start)
for i in range(len(dp_dists)):
sum_dists[i] += dp_dists[i]
# 모임장소는 모든 친구들의 이동경로 합이 최소가 되는 방.
for i in range(1,N+1):
if sum_dists[i] ==min(sum_dists):
print(i)
break
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 1753 최단경로 (0) | 2021.07.20 |
---|---|
[백준][Python] 2696 중앙값구하기 (0) | 2021.07.20 |
[백준][Python] 1240 노드사이의 거리 (0) | 2021.07.20 |
[백준][Python] 9933 민균이의 비밀번호 (0) | 2021.07.20 |
[백준][Python] 2448 별찍기(11) (0) | 2021.07.19 |