import sys
input = sys.stdin.readline
INF = float('inf')
N = int(input())
A,B,C,D = map(int,input().split())
X = list(map(int,input().split()))
# MST seed : node 0
V = [False]*N
dist = [INF]*N
dist[0] = 0
answer = 0
for _ in range(N):
# 3. 현재까지 MST 중 거리가 가장 작은 간선 선택하기
x = -1
cost = INF
for i in range(N):
if not V[i] and dist[i] < cost:
cost = dist[i]
x = i
# 1. MST 연결 후, 간선 추가하기
V[x] = True
answer += cost
# 2. node 0에서 시작해서
for nx in range(N):
if not V[nx]:
ncost = ((X[min(x,nx)]*A+X[max(x,nx)]*B)%C)^D
if ncost < dist[nx]:
dist[nx] = ncost
print(answer)
코멘트
내부 for문의 순서를 다시 생각해보면 좋다.
현재 0에서 출발해서 answer에 cost를 추가한다.
현재 스패닝 트리에서 가장 가까운 거리를 dist에 업데이트한다.
스패닝 트리가 연결되면서 현재까지 스패닝 트리와 다른 노드까지 거리 dist와 새로 추가된 node nx에서 거리 ncost랑 비교를 한다.
댓글