처음엔 네크워킹만 보고 MST생각해서 바로 크루스칼로 풀었는데 틀렸다.
"복구 전보다 모든 컴퓨터에 대해 전송시간이 짧아야한다"
이걸 맵 전체로 해석했기 때문인데 사실은 모든 노드에 대해 최소 거리를 가져야 한다는 말이다.
import sys
input = sys.stdin.readline
def find(x):
if parents[x]==x:
return x
parents[x] = find(parents[x])
return parents[x]
def union(a,b):
a = find(a)
b = find(b)
if a>b:
parents[a] = b
else:
parents[b] = a
# N개의 컴퓨터 네트워크.
# 회선은 성능차이가 있음.
N,M = map(int,input().split())
sercuits = []
parents = [i for i in range(N+1)]
for _ in range(M):
A,B,C = map(int,input().split())
sercuits.append([C,A,B])
sercuits.sort(reverse=True)
cnt=0
restore_line=[]
while sercuits:
time,a,b = sercuits.pop()
if find(a) != find(b):
union(a,b)
cnt+=1
restore_line.append([a,b])
print(cnt)
for line in restore_line:
print(*line)
때문에 다익스트라로 다시풀었다. 모든 노드에 대해 이어져있고 path 딕셔너리에 마지막으로 최신화된 이동의 경로까지 기록해줬다.
import sys
input = sys.stdin.readline
from heapq import heappop,heappush
def dijkstra(start):
heap = []
dp_dists[start] = 0
heappush(heap,[dp_dists[start],start])
while heap:
cur_dists,cur_node= heappop(heap)
for next_dists,next_node in network[cur_node]:
if dp_dists[next_node] > cur_dists + next_dists:
dp_dists[next_node] = cur_dists + next_dists
path[next_node] = cur_node
heap.append([dp_dists[next_node],next_node])
N,M = map(int,input().split())
network = {i:[] for i in range(1,N+1)}
dp_dists = {i:float('inf') for i in range(1,N+1)}
path = {i:0 for i in range(1,N+1)}
for _ in range(M):
A,B,C = map(int,input().split())
network[A].append([C,B])
network[B].append([C,A])
dijkstra(1)
print(N-1)
for i in range(2,N+1):
print(i,path[i])
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 1059 좋은구간 (0) | 2021.07.30 |
---|---|
[백준][Python] 14930 쉬운최단거리 (0) | 2021.07.30 |
[백준][Python] 14003 가장 긴 증가하는 부분수열 5 : 이분탐색과 인덱스 (0) | 2021.07.29 |
[백준][Python] 16940 BFS스페셜저지 (0) | 2021.07.29 |
[백준][Python] 9663 N-Queen : 대각선, 열, 행 자료구조 효율적관리 (0) | 2021.07.29 |