728x90
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 | ''' 서울(0), 천안(1), 원주(2), 논산(3), 대전(4), 대구(5), 강릉(6), 광주(7), 부산(8), 포항(9) ''' ''' 10 14 0 1 12 0 2 15 1 3 4 1 4 10 2 5 7 2 6 21 3 4 3 3 7 13 4 5 10 5 8 9 5 9 19 6 9 25 7 8 15 8 9 5 간선의 개수 출발 - 끝 - 가중치 입력을 인접 행렬로 받는다 ''' def prim(start): # 시작점 설정 ( 가중치 0으로 ) total = 0 u = 0 # 가중치가 최소인 정점 dist[u] = 0 # 정점의 갯수만큼 반복 for i in range(V): # 가중치 최소값 찾기 min = 987654321 for v in range(V): if visited[v] == 0 and min > dist[v]: min = dist[v] u = v # 최소값 # 방문처리 visited[u] = 1 total += adj[PI[u]][u] # 인접 정점에 업데이트하기 for v in range(V): # 인접하고 방문 안하고 간선의 가중치 정점의 가중치를 비교 if adj[u][v] != 0 and visited[v] == 0 and adj[u][v] < dist[v]: dist[v] = adj[u][v] # 가중치 PI[v] = u return total V, E = map(int, input().split()) # 정점수, 간선수 adj = [[0]* V for _ in range(V)] # 인접 행렬/ 0번부터 했으니까 +1 안해도됨 dist = [987654321] * V # 가중치 PI = list(range(V)) # 부모 ( 내 부모는 나임 = make_set) visited = [0] * V # 방문체크 #입력 for i in range(E): edge = list(map(int, input().split())) # 출발, 도착, 가중치 adj[edge[0]][edge[1]] = edge[2] adj[edge[1]][edge[0]] = edge[2] print(prim(v)) | cs |
728x90
'SSAFY > Python문법 정리' 카테고리의 다른 글
[JS]Vue router (0) | 2021.05.10 |
---|---|
[JS] 새로고침 없이 좋아요, Follow 하기 (0) | 2021.05.06 |
[Python] 큐의 구조 (0) | 2021.03.03 |
[Python] 스택 2 (0) | 2021.02.24 |
[Python] 스택 (0) | 2021.02.23 |