SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제의 저작권은 SW Expert Acedemy에 있습니다.
문제접근
모든 섬이 연결되어 있다고 가정하고, 최소비용신장트리를 만들면 간단하게 풀린다.
간선정보가 따로 주어지지 않으므로, 정점(섬)간의 거리를 직접 계산하여 최소비용을 갱신했다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
'''
완전 그래프라고 생각하고
프림알고리즘을 사용해 풀었습니다.
'''
import sys
sys.stdin = open("input.txt", "r")
def tex_rate(x1, y1, x2, y2):
""" 터널길이를 구하는 함수. """
return (x2 - x1) ** 2 + (y2 - y1) ** 2
def select_vertex(n, visited, dist, INF):
""" 정점 선택을 위한 함수. """
vertex = -1
min_dist = INF
for i in range(n):
if not visited[i] and min_dist > dist[i]:
min_dist = dist[i]
vertex = i
return vertex, min_dist
def prim(N, x_points, y_points):
""" 프림 알고리즘으로 최소비용을 구함. """
INF = tex_rate(0, 0, 1000001, 1000001)
# 선택여부 확인 변수
visited = [False] * N
# 각 정점에서의 최소 연결가중치를 기록하는 변수
dist = [INF] * N
# 누적합을 담을 정답변수 실수로 초기화
answer = 0.0
# 0번부터 시작하기 위해 dist[0]을 0으로 초기화
dist[0] = 0
for _ in range(N):
u, min_dist = select_vertex(N, visited, dist, INF)
if u is -1: break
answer += min_dist
visited[u] = True
for v in range(N):
if not u is v and not visited[v]:
dist[v] = min(dist[v], tex_rate(x_points[u], y_points[u], x_points[v], y_points[v]))
return answer
def main():
T = int(input())
for tc in range(1, T + 1):
# 섬의 갯수
N = int(input())
# 모든 섬의 x, y 좌표
x_points = list(map(int, input().split()))
y_points = list(map(int, input().split()))
# 환경 세율
E = float(input())
print(f'#{tc} {round(prim(N, x_points, y_points) * E)}')
if __name__ == '__main__':
main()
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
[SWEA - 8189] 우편함 - c++ (0) | 2020.07.06 |
---|---|
[SWEA - 1861] 정사각형 방 (0) | 2020.07.06 |
[프로그래머스] 등굣길 - python (0) | 2020.07.06 |
[백준 9205] 맥주 마시면서 걸어가기 - c++ (0) | 2020.05.10 |
[프로그래머스 - LV3] 여행경로 - python (0) | 2020.05.10 |