practivceAlgorithm/백준
[백준][Python] 13424 비밀모임
findTheValue
2021. 7. 20. 16:33
최소거리 배열 다 구해서 전부 더해준 다음 합 미니멈인 방번호 출력
다익스트라로 간단하게 풀었다.
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