관리 메뉴

공부 기록

[8주차] 최단 경로 본문

코딩테스트/자료구조

[8주차] 최단 경로

_JAEJAE_ 2021. 10. 2. 10:56

- 플로이드 와샬 알고리즘 : 모든 노드를 방문하는 최단 경로

 

- 다익스트라 알고리즘 : 특정 노드에서 다른 노드까지의 최단 경로

 

<플로이드 와샬>

values = [2**31-1 for i in range(n)] # 비용 배열, 거리 배열 선언
visited = [False for i in range(n)]  # 0번 노드를 시작점으로 설정

start = 0
vistied[start] = True
values[start] = 0

while False in visited: # 방문하지 않은 노드가 있다면 
	# 노드 완전탐색으로 비용배열의 거리 값 최소화
    for i in costs:
    	if (visited[i[1]] == False and i[0] == start):
       		values[i[1]] = min(values[i[1]], i[2])
        if (visited[i[0]] == False and i[1] == start):
        	values[i[0]] = min(values[i[0]], i[2])
    refer = 2**31-1
    
	# 방문하지 않은 노드 중 최소 비용 노드 위치 탐색
    for i in range(n):
    	if(visited[i] == False and values[i] != 0):
    		refer = min(refer, values[i])
    answer += refer
    
    # 해당 노드 방문 여부 체크
    for i in range(n):
	    if(visited[i] == False and values[i] == refer):
           	visited[i] = True
            start = i
            break

 

<다익스트라>

visited = [False for _ in range(n)] # 비용 배열, 거리 배열 선언
cost = [sys.maxsize for _ in range(n)] 
visited[0] = True # 0번 노드를 시작점으로 설정
cost[0] = 0 
length = len(visited)

while False in visited: # 방문하지 않은 노드가 있다면
	# 방문하지 않은 지역 중 최솟값 찾기
    checkLoc = -1
    checkValue = sys.maxsize
    
    for i in range(length):
    	if visited[i] == False and cost[i] < checkValue:
        	checkLoc = i
            checkValue = cost[i]
    
    # 검사할 후보가 없으면 탈출
    if checkLoc == -1:
    	break
    visited[checkLoc] = True
    
    # 경로 완전탐색으로 비용배열 수정
    for v1, v2, c in costs:
    	if v1 == checkLoc and visited[v2] == False:
        	cost[v2] = min(cost[v2], cost[v1] + c)
        if v2 == checkLoc and visited[v1] == False:
        	cost[v1] = min(cost[v1], cost[v2] + c)

'코딩테스트 > 자료구조' 카테고리의 다른 글

[10주차] 연결 리스트와 트라이 구조  (0) 2021.10.02
[9주차] 탐욕법  (0) 2021.10.02
[7주차] 동적계획법  (0) 2021.09.26
[6주차] 재귀함수  (0) 2021.08.26
[5주차] 해시  (0) 2021.08.22
Comments