You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 좌표 최단 거리 알고리즘 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: 좌표 최단 거리 알고리즘 최단경로 알고리즘 종류, 그래프 최단 경로 알고리즘, 플로이드 최단 경로 알고리즘, 최단 경로 문제, 모든 쌍 최단 경로 알고리즘, 플로이드 워셜 알고리즘, C 미로 최단 경로, 다 익스트라 벨만 포드 시간 복잡도
좌표 최단 거리 알고리즘
- Article author: www.zerocho.com
- Reviews from users: 4397 Ratings
- Top rated: 4.4
- Lowest rated: 1
- Summary of article content: Articles about 좌표 최단 거리 알고리즘 위와 같은 좌표를 준비해보았습니다. 저희는 A에서 F까지의 최단 거리를 구하고 싶습니다. 기존 그래프 코드로는 좌표 평면 위에 있는 그래프를 표현하지 못하므로 새롭게 … …
- Most searched keywords: Whether you are looking for 좌표 최단 거리 알고리즘 위와 같은 좌표를 준비해보았습니다. 저희는 A에서 F까지의 최단 거리를 구하고 싶습니다. 기존 그래프 코드로는 좌표 평면 위에 있는 그래프를 표현하지 못하므로 새롭게 …
- Table of Contents:
[알고리즘] 최단거리탐색 다익스트라, 플로이드 워셜, 벨만포드, A*
- Article author: devlibrary00108.tistory.com
- Reviews from users: 35462 Ratings
- Top rated: 3.5
- Lowest rated: 1
- Summary of article content: Articles about [알고리즘] 최단거리탐색 다익스트라, 플로이드 워셜, 벨만포드, A* [알고리즘] 최단거리탐색 다익스트라, 플로이드 워셜, 벨만포드, A* … 최단 경로 알고리즘. … 8방향이면 이면 (좌표차이 피타고라스) …
- Most searched keywords: Whether you are looking for [알고리즘] 최단거리탐색 다익스트라, 플로이드 워셜, 벨만포드, A* [알고리즘] 최단거리탐색 다익스트라, 플로이드 워셜, 벨만포드, A* … 최단 경로 알고리즘. … 8방향이면 이면 (좌표차이 피타고라스) 최단 경로 알고리즘. 주요 알고리즘 BFS (완전탐색 알고리즘) 가중치가 없거나 모든 가중치가 동일한 그래프에서 최단경로를 구하는 경우 가장 빠르다 다익스트라 알고리즘 (Dijkstra Algorithm) 음이 아닌 가중..
- Table of Contents:
다익스트라
2 플로이드 워셜
3 벨만-포드 알고리즘
4 A 알고리즘
[Algorithm] 미로의 최단거리 통로(BFS)
- Article author: cornarong.tistory.com
- Reviews from users: 18385 Ratings
- Top rated: 4.7
- Lowest rated: 1
- Summary of article content: Articles about [Algorithm] 미로의 최단거리 통로(BFS) 경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 … …
- Most searched keywords: Whether you are looking for [Algorithm] 미로의 최단거리 통로(BFS) 경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 … 설명 7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요. 경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7..
- Table of Contents:
[BFS] 미로 최단 거리 찾기
- Article author: velog.io
- Reviews from users: 21113 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about [BFS] 미로 최단 거리 찾기 7\*7 격자판 미로를 탈출하는 최단경로의 경로수를 출력하는 프로그램을 작성 … 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. …
- Most searched keywords: Whether you are looking for [BFS] 미로 최단 거리 찾기 7\*7 격자판 미로를 탈출하는 최단경로의 경로수를 출력하는 프로그램을 작성 … 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 7\*7 격자판 미로를 탈출하는 최단경로의 경로수를 출력하는 프로그램을 작성하세요. 경로수는출발점에서 도착점까지 가는데 이동한 횟수를 의미한다. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.격자판의 움
- Table of Contents:
알고리듬
▣ 입력설명
▣ 출력설명
▣ 입력예제 1
풀이
회고
알고리즘 공부방 (8 Page)
- Article author: arnold518.tistory.com
- Reviews from users: 8867 Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about 알고리즘 공부방 (8 Page) 플로이드-워셜 알고리즘은 그래프에서 모든 점들의 쌍 (u, v) 간의 최단거리를 다 구하는 … 직사각형들의 x좌표에 대해 직사각형의 왼쪽 변은 +1, 오른쪽 변은 -1을 … …
- Most searched keywords: Whether you are looking for 알고리즘 공부방 (8 Page) 플로이드-워셜 알고리즘은 그래프에서 모든 점들의 쌍 (u, v) 간의 최단거리를 다 구하는 … 직사각형들의 x좌표에 대해 직사각형의 왼쪽 변은 +1, 오른쪽 변은 -1을 …
- Table of Contents:
최단 경로문제 예제 경로 자바 좌표 거리 알고리즘 거리 영어로
- Article author: jsa1371.tistory.com
- Reviews from users: 38273 Ratings
- Top rated: 3.3
- Lowest rated: 1
- Summary of article content: Articles about 최단 경로문제 예제 경로 자바 좌표 거리 알고리즘 거리 영어로 최단 경로문제 예제 경로 자바 좌표 거리 알고리즘 거리 영어로. 쭈히남편 2019. 8. 18. 10:29. – 최단 경로문제 예제. 최단 경로는 이름 그대로 가장 짧은 경로를 … …
- Most searched keywords: Whether you are looking for 최단 경로문제 예제 경로 자바 좌표 거리 알고리즘 거리 영어로 최단 경로문제 예제 경로 자바 좌표 거리 알고리즘 거리 영어로. 쭈히남편 2019. 8. 18. 10:29. – 최단 경로문제 예제. 최단 경로는 이름 그대로 가장 짧은 경로를 … 쭈히남편 님의 블로그입니다.
- Table of Contents:
[BOJ] 백준 5620번 : 가장 가까운 두 점의 거리 (JAVA)
- Article author: steady-coding.tistory.com
- Reviews from users: 32584 Ratings
- Top rated: 4.7
- Lowest rated: 1
- Summary of article content: Articles about [BOJ] 백준 5620번 : 가장 가까운 두 점의 거리 (JAVA) 먼저, 알고리즘의 중심 로직부터 살펴보겠습니다. 1. points 배열을 x좌표에 대해 … 첫 번째와 두 번째 좌표 사이의 거리를 최단 거리라고 가정. …
- Most searched keywords: Whether you are looking for [BOJ] 백준 5620번 : 가장 가까운 두 점의 거리 (JAVA) 먼저, 알고리즘의 중심 로직부터 살펴보겠습니다. 1. points 배열을 x좌표에 대해 … 첫 번째와 두 번째 좌표 사이의 거리를 최단 거리라고 가정. 문제 평면상에 n개의 점 (P1, …. , Pn) 이 놓여져있다고 했을 때, 거리가 최소인 두 개의 점을 구하고 그 거리를 알고 싶다. 입력 입력은 첫 번째 줄에 정수로 된 점의 개수 n이 주어진다. 두 번째 줄부터 n..
- Table of Contents:
다국어 번역
다크 모드
글자 크기
플레이 버튼을 눌러 주세요
공지사항
프로필
카테고리
추천 글
인기 글
방문자 통계
문제
입력
출력
풀이
소스코드
참고 사이트
추천 글
댓글0
추천 글
티스토리툴바
좌표 최단 거리 알고리즘
- Article author: www.koreascience.or.kr
- Reviews from users: 37071 Ratings
- Top rated: 4.1
- Lowest rated: 1
- Summary of article content: Articles about 좌표 최단 거리 알고리즘 된 알고리즘은 출발노드와 목적노드를 최소의 노드 수로 연결하면서 직선거리의 합이 최소인 임시경로를 구축하고 … 리로 노드좌표를 이용하면 쉽게 계산할 수 있다. …
- Most searched keywords: Whether you are looking for 좌표 최단 거리 알고리즘 된 알고리즘은 출발노드와 목적노드를 최소의 노드 수로 연결하면서 직선거리의 합이 최소인 임시경로를 구축하고 … 리로 노드좌표를 이용하면 쉽게 계산할 수 있다.
- Table of Contents:
다익스트라 알고리즘 (1753 최단경로)
- Article author: cantcoding.tistory.com
- Reviews from users: 48998 Ratings
- Top rated: 4.6
- Lowest rated: 1
- Summary of article content: Articles about 다익스트라 알고리즘 (1753 최단경로) 다익스트라 알고리즘과 벨만-포드 알고리즘이 있다. … 이 코드를 통하여 k지점에서부터의 모든 좌표에 최단경로들을 알 수 있다. …
- Most searched keywords: Whether you are looking for 다익스트라 알고리즘 (1753 최단경로) 다익스트라 알고리즘과 벨만-포드 알고리즘이 있다. … 이 코드를 통하여 k지점에서부터의 모든 좌표에 최단경로들을 알 수 있다. 단일 출발지 최단 경로( Single Source Shortest Path ) 하나의 출발점에서 각 정점까지 도달하는데 비용을 계산하여 최단경로를 구하는 것에는 두가지 다익스트라 알고리즘과 벨만-포드 알고리즘이 있다. 다익스..
- Table of Contents:
코딩못하는사람
다익스트라 알고리즘 (1753 최단경로) 본문
1753 최단경로
See more articles in the same category here: https://chewathai27.com/to/blog.
[알고리즘] 최단거리탐색 다익스트라, 플로이드 워셜, 벨만포드, A*
최단 경로 알고리즘.
주요 알고리즘 BFS (완전탐색 알고리즘) 가중치가 없거나 모든 가중치가 동일한 그래프에서 최단경로를 구하는 경우 가장 빠르다 다익스트라 알고리즘 (Dijkstra Algorithm) 음이 아닌 가중 그래프에서의 단일 쌍, 단일 출발, 단일 도착 최단 경로 문제 벨만-포드 알고리즘 (Bellman-Ford-Moore Algorithm) 가중 그래프에서의 단일 쌍, 단일 출발, 단일 도착 최단 경로 문제 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm) 전체 쌍 최단 경로 문제, 다수출발, 단일도착 하나의 정점에서부터 다른 하나의 정점까지의 최단 경로를 구하는 경우 A*알고리즘이 적합하다.
다익스트라
특정 노드에서 다른 모든 노드로 가는 최단경로를 갱신.
음의 간선이 없을 때 정상 동작. (그리디를 다르는 선택과 dp로 저장, 최신화 반복.)
다익스트라 알고리즘의 동작 과정
현재 선택한 정점(처음엔 시작점)에 곧장 연결되고, 아직 방문하지 않은 정점들을 모두 본다. 선택한 정점과 보고있는 정점 사이의 거리와 시작 정점과 선택한 정점까지의 최단거리의 합이 현재까지 구한 시작 정점과 보고 있는 정점 사이의 거리보다 짧을 경우, 이를 갱신해준다. 1, 2번 수행이 모두 끝난 이후, 아직 방문하지 않은 정점들 중 시작점과의 거리가 가장 짧은 정점을 선택한다. 방문하지 않은 정점이 존재하여 정점을 선택했다면, 현재 구한 시작점으로부터의 현재 선택한 정점 사이의 거리는 최단거리이다. 방문하지 않은 정점이 존재하지 않는다면, 수행을 종료한다. 그렇지 않으면 1번으로 돌아가 수행을 반복한다.
다익스트라 알고리즘 특징
그리디 알고리즘 : 매상황에서 방문하지 않은 가장 비용이 적은 노드 선택
단계 거치며 한번 처리된 노드(이미 방문 처리)의 최단 거리는 고정되어 바뀌지 않음
한 단계당 하나의 노드에 대한 최단 거리를 확실히 찾는 것으로 이해
다익스트라 수행 후 , 테이블에 각 노드까지의 최단 거리 정보가 저장됨
단계마다 방문하지 않은 노드 중 최단 거리 가장 짧은 노드 선택하기 위해
매 단계마다 1차원 테이블의 모든 원소를 확인(순차 탐색)
순차 탐색 : 시간복잡도 O(N^2)
O(N)번에 걸쳐서 최단거리가 가장 짧은 노드 매번 선형탐색해야 하고, 현재 노드와 연결된 노드 매번 확인
전체노드개수가 5000이하라면 이렇게 풀 수 있으나 10000개넘어가면 해결 어려움
힙 자료구조 이용하는 다익스트라 알고리즘의 시간복잡도는 O(ElogV)
노드를 하나씩 꺼내 검사하는 반복문은 노드의 개수 V 이상의 횟수로는 처리되지 않음
결과적으로 현재 우선순위 큐에서 꺼낸 노드와 연결된 다른 노드들을 확인하는 총횟수는
최대 간선의 개수(E)만큼 연산이 수행될 수 있음(내부적으로 힙이 정렬해주기 때문에 )
직관적으로 전체 과정은 E개의 원소를 우선순위 큐에 넣었다가 모두 빼내는 연산과 매우 유사
시간복잡도를 O(ElogE)로 판단 가능
중복 간선(양방향) 포함하지 않는 경우, 이를 O(ElogV) O(ElogE) -> O(ElogV^2) -> O(2ElogV) -> O(ElogV) ( 앞에 곱해진 2는 표기법에서 제거) 간선 개수 100,000개 , 노드 개수 10000개 까지는 1초안에 해결
로 정리
import heapq # import sys # input = sys.stdin.readline INF = int(1e9) # 무한을 의미하는 값으로 10억을 설정 # 노드의 개수, 간선의 개수 n,m = map(int, input().split()) # 시작 노드 번호 start = int(input()) # 각 노드에 연결되어 있는 노드에 대한 정보 담는 리스트 만들기 graph = [[] for i in range(n+1)] # 최단 거리 테이블을 모두 무한으로 초기화 distance = [INF] * (n+1) # 모든 간선 정보 입력받기 for _ in range(m): a, b, c = map(int, input().split()) # a번 노드에서 b번 노드로 가는 비용이 c라는 의미 graph[a].append((b,c)) def dijkstra(start): q = [] # 시작 노드로 가기 위한 최단 경로는 0으로 설정하여, 큐에 삽입 heapq.heappush(q, (0, start)) distance[start] = 0 while q: # 가장 최단 거리가 짧은 노드에 대한 정보 꺼내기 dist, now = heapq.heappop(q) # 련재 노드가 이미 처리된 적이 있는 노드라면 무시 if distance[now] < dist: continue # 현재 노드와 연결된 다른 인접한 노드들을 확인 for i in graph[now]: cost = dist + i[1] # 현재 노드 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우 if cost < distance[i[0]]:# i[0] : 도착 노드임 , 햇갈리지 말자 distance[i[0]]= cost heapq.heappush(q, (cost, i[0])) dijkstra(start) # 모든 노드로 가기 위한 최단 거리 출력 for i in range(1, n+1): # 도달할 수 없는 경우, 무한 이라고 출력 if distance[i] == INF: print("INFINITY") # 도달할 수 있는 경우 거리를 출력 else: print(distance[i]) 처음, 시작점을 제외한 모든 정점으로의 경로를 무한으로 한다. 선택한 정점(처음엔 시작점)으로부터 바로 이어진 정점으로의 경로를 구하고, 그 경로의 거리가 이어진 정점으로의 거리보다 작을 경우, 경로를 갱신해주면서 min heap에 추가한다. min heap의 top의 정점을 v라고 할 때에, v가 아직 선택하지 않은 정점일 때까지 heap에서 pop한다. v가 아직 방문하지 않은 정점이라면 그 정점에서부터 2번을 반복한다. 이 반복은 heap이 비어있지 않을 때까지 반복된다. 2. 플로이드 워셜 모든 노드에서 다른 모든 노드까지의 최단 경로. 매 단계마다 방문하지 않은 노드 중 최단거리 찾는 과정 필요x(우선순위큐 안써도됨.) 2차원 테이블에 최단거리 정보 저장. dp 각 단계마다 특정 노드 K 거쳐가는 경우 확인.min(A->B,A->K->B)
플로이드 워셜을 사용하는 문제는 노드의 개수가 500개 이하인 경우 대부분
-> 시간복잡도가 nn n 이므로 n=1000이라면 10억을 넘어간다
INF = int(1e9) # 무한을 의미하는 10억 설정 # 노드의 개수 및 간선의 개수 입력 받기 n = int(input()) m = int(input()) # 2차원 리스트를 만들고, 무한으로 초기화 graph = [[INF]*(n+1) for _ in range(n+1)] # 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화 for a in range(1, n+1): for b in range(1, n+1): if a==b: graph[a][b] = 0 # 각 간선에 대한 정보 입력받아, 그 값으로 초기화 for _ in range(m): # a에서 b로 가는 비용은 c a, b, c = map(int, input().split()) graph[a][b] = c ”’위에꺼 3개 한번에 처리 for(int i = 1; i<=n; i++){ for(int j =1; j<=n; j++){ if (i == j) dist[i][j] = 0; else if (adj[i][j]) dist[i][j] = adj[i][j]; else dist[i][j] = INF; } } ''' # 점화식에 따라 플로이드 워셜 수행 for k in range(1, n+1): for a in range(1, n+1): for b in range(1, n+1): graph[a][b] = min(graph[a][b], graph[a][k]+ graph[k][b]) # 수행된 결과 출력 for a in range(1, n+1): for b in range(1, n+1): # 도달할 수 없는 경우, 무한으로 출력 if graph[a][b] == INF: print("INFINITY", end= ' ') # 도달할 수 있는 경우 거리를 출력 else: print(graph[a][b], end=' ') print() 플로이드 워셜 알고리즘 성능 분석 노드의 개수가 N개일 때 알고리즘상으로 N번의 단계를 수행 각 단계마다 O(N^2)의 연산을 통해 현재 노드를 거쳐 가는 모든 경로를 고려 총 시간 복잡도는 0(N^3) 3. 벨만-포드 알고리즘 음수 싸이클 없는 그래프에서 한정점 -> 모든 정점 최단경로 및 거리.
특징
음의 가중치를 가지는 간선도 가능하다.
음의 사이클의 존재 여부를 확인할 수 있다.
최단거리를 구하기 위해서 V-1번 E개의 모든 간선을 확인한다.
음의 사이클 존재 여부를 확인하기 위해서 한 번 더 E개의 간선을 확인한다.
총 연산횟수는 V*E이다. 따라서 시간복잡도는 O(VE)이다.
V번째 모든 간선을 확인하였을 때 거리 배열이 갱신되었다면, 그래프 G는 음의 사이클을 가지는 그래프이다. 그래프 모든 엣지에 대해 edge relaxation을 시작노드를 제외한 전체 노드수 만큼 반복 수행한 뒤, 마지막으로 그래프 모든 엣지에 대해 edge relaxation을 1번 수행해 준다. 이때 한번이라도 업데이트가 일어난다면 음의 사이클이 존재한다는 뜻이 되어서 결과를 구할 수 없다는 의미의 false를 반환하고 함수를 종료한다.
INF = int(1e9) def bf(start): dis[start] = 0 # 시작 지점 초기화 # 매 반복마다 모든 간선 확인 # 음의 간선 사이클 존재 유무가 필요하면 n번과 return 처리 # 필요 없다면 n-1번과 리턴 처리는 필요 없음 dis 테이블만 필요함 for i in range(n): # 모든 간선 확인 for j in range(m): current = edges[j][0] next_node = edges[j][1] cost = edges[j][2] # 시작위치에서 현재 노드까지 이동이 가능하면서 # 현재 간선을 거쳐서 다른 노드로 이동하는 거리가 더 짧은경우 if dis[current] != INF and dis[next_node] > cost + dis[current]: dis[next_node] = dis[current] + cost # 싸이클 유무 확인을 위해 n번 돌렸을 때 # 최단 거리 갱신이 발생하면 음의 사이클이 존재 if i == n – 1: return True return False # 노드, 간선 개수 n, m = map(int, input().split()) edges = [] dis = [INF] * n # 최단 거리 테이블 # 간선 정보 for _ in range(m): a, b, c = map(int, input().split()) edges.append((a, b, c)) cycle = bf(1) if cycle: # 음의 사이클 발생 print(-1) else: # 1번 노드에서 시작했으니 다른 노드로 가기 위한 최단 거리 출력 for i in range(2, n + 1): if dis[i] == INF: print(-1) else: print(dis[i])
def bellman_ford(graph, start): distance, predecessor = dict(), dict() # 거리 값, 각 정점의 이전 정점을 저장할 딕셔너리 # 거리 값을 모두 무한대로 초기화 / 이전 정점은 None으로 초기화 for node in graph: distance[node], predecessor[node] = float(‘inf’), None distance[start] = 0 # 시작 정점 거리는 0 # 간선 개수(V-1)만큼 반복 for _ in range(len(graph) – 1): for node in graph: for neighbour in graph[node]: # 각 정점마다 모든 인접 정점들을 탐색 # (기존 인접 정점까지의 거리 > 기존 현재 정점까지 거리 + 현재 정점부터 인접 정점까지 거리)인 경우 갱신 if distance[neighbour] > distance[node] + graph[node][neighbour]: distance[neighbour] = distance[node] + graph[node][neighbour] predecessor[neighbour] = node # 음수 사이클 존재 여부 검사 : V-1번 반복 이후에도 갱신할 거리 값이 존재한다면 음수 사이클 존재 for node in graph: for neighbour in graph[node]: if distance[neighbour] > distance[node] + graph[node][neighbour]: return -1, “그래프에 음수 사이클이 존재합니다.” return distance, predecessor # 음수 사이클이 존재하지 않는 그래프 graph = { ‘A’: {‘B’: -1, ‘C’: 4}, ‘B’: {‘C’: 3, ‘D’: 2, ‘E’: 2}, ‘C’: {}, ‘D’: {‘B’: 1, ‘C’: 5}, ‘E’: {‘D’: -3} } # 그래프 정보와 시작 정점을 넘김 distance, predecessor = bellman_ford(graph, start=’A’) print(distance) print(predecessor) # 음수 사이클이 존재하는 그래프 graph = { ‘A’: {‘B’: -1, ‘C’: 4}, ‘B’: {‘C’: 3, ‘D’: 2, ‘E’: 2}, ‘C’: {‘A’: -5}, ‘D’: {‘B’: 1, ‘C’: 5}, ‘E’: {‘D’: -3} } distance, predecessor = bellman_ford(graph, start=’A’) print(distance) print(predecessor)
시작점을 제외한 모든 정점으로의 최단거리를 무한으로 설정한다(시작점은 0). 이후 다음 수행을 반복한다. 그래프 내에 모든 간선에 대해 2번을 시행한다. 정점 A에서 정점 B로의 방향을 가지고 있는 각 간선에 대해 현재 정점 B까지의 거리가 정점 A까지의 거리와 현재 간선의 거리의 합보다 클 경우, 정점 B의 경로와 거리를 갱신해준다. 이를 경로와 거리의 갱신이 일어나지 않을 때까지 반복해준다. 만약, 정점의 수 만큼의 시행 이후에도 경로와 거리의 갱신이 일어날 경우, 음수 사이클이 존재한다고 판단한다.
=> 정점의 수* 간선의 수 시행으로 최단경로를 구할 수 있다. 이상 탐색하면 음의사이클을 가지는 것
4. A* 알고리즘
F = 출발 지점에서 목적지까지 총 cost 합
G = 현재 노드에서 출발 지점까지의 총 cost
H = Heuristic(휴리스틱) : 현재 노드에서 목적지까지의 추정거리
F = G+H
4방향이면 좌표차이
8방향이면 이면 (좌표차이 피타고라스)
# Time Complexity는 H에 따라 다르다. # O(b^d), where d = depth, b = 각 노드의 하위 요소 수 # heapque를 이용하면 길을 출력할 때 reverse를 안해도 됨 class Node: def __init__(self, parent=None, position=None): self.parent = parent self.position = position self.g = 0 self.h = 0 self.f = 0 def __eq__(self, other): return self.position == other.position def heuristic(node, goal, D=1, D2=2 ** 0.5): # Diagonal Distance dx = abs(node.position[0] – goal.position[0]) dy = abs(node.position[1] – goal.position[1]) return D * (dx + dy) + (D2 – 2 * D) * min(dx, dy) def aStar(maze, start, end): # startNode와 endNode 초기화 startNode = Node(None, start) endNode = Node(None, end) # openList, closedList 초기화 openList = [] closedList = [] # openList에 시작 노드 추가 openList.append(startNode) # endNode를 찾을 때까지 실행 while openList: # 현재 노드 지정 currentNode = openList[0] currentIdx = 0 # 이미 같은 노드가 openList에 있고, f 값이 더 크면 # currentNode를 openList안에 있는 값으로 교체 for index, item in enumerate(openList): if item.f < currentNode.f: currentNode = item currentIdx = index # openList에서 제거하고 closedList에 추가 openList.pop(currentIdx) closedList.append(currentNode) # 현재 노드가 목적지면 current.position 추가하고 # current의 부모로 이동 if currentNode == endNode: path = [] current = currentNode while current is not None: # maze 길을 표시하려면 주석 해제 # x, y = current.position # maze[x][y] = 7 path.append(current.position) current = current.parent return path[::-1] # reverse children = [] # 인접한 xy좌표 전부 for newPosition in [(0, -1), (0, 1), (-1, 0), (1, 0), (-1, -1), (-1, 1), (1, -1), (1, 1)]: # 노드 위치 업데이트 nodePosition = ( currentNode.position[0] + newPosition[0], # X currentNode.position[1] + newPosition[1]) # Y # 미로 maze index 범위 안에 있어야함 within_range_criteria = [ nodePosition[0] > (len(maze) – 1), nodePosition[0] < 0, nodePosition[1] > (len(maze[len(maze) – 1]) – 1), nodePosition[1] < 0, ] if any(within_range_criteria): # 하나라도 true면 범위 밖임 continue # 장애물이 있으면 다른 위치 불러오기 if maze[nodePosition[0]][nodePosition[1]] != 0: continue new_node = Node(currentNode, nodePosition) children.append(new_node) # 자식들 모두 loop for child in children: # 자식이 closedList에 있으면 continue if child in closedList: continue # f, g, h값 업데이트 child.g = currentNode.g + 1 child.h = ((child.position[0] - endNode.position[0]) ** 2) + ((child.position[1] - endNode.position[1]) ** 2) # child.h = heuristic(child, endNode) 다른 휴리스틱 # print("position:", child.position) 거리 추정 값 보기 # print("from child to goal:", child.h) child.f = child.g + child.h # 자식이 openList에 있으고, g값이 더 크면 continue if len([openNode for openNode in openList if child == openNode and child.g > openNode.g]) > 0: continue openList.append(child) def main(): # 1은 장애물 maze = [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] start = (0, 0) end = (7, 6) path = aStar(maze, start, end) print(path) if __name__ == ‘__main__’: main() # [(0, 0), (1, 1), (2, 2), (3, 3), (4, 3), (5, 4), (6, 5), (7, 6)]
공간복잡도
플로이드: V^2
다익스트라: V+E(인접리스트)
시간복잡도
플로이드: V^3
다익스트라: V^2(인접행렬), ElogV(인접리스트 + 우선순위 큐) ->
VlogV (피보나치힙이나 이진검색트리 사용, 하지만 이런 자료구조들은 상수가 커서 잘 안씀.)
장단점
– 플로이드 알고리즘 소스가 훨씬 더 간결하다.
– 플로이드 알고리즘은 간선 수가 많으면 다익스트라 알고리즘보다 빠를 수가 있음.
– 시작점으로부터 각 정점까지 최단거리만 구해도 될 때, 보통 다익스트라 알고리즘이 압도적으로 빠름.
– 그래프에 음의 가중치 간선이 있으면(물론 음의 싸이클은 없어야 한다) 다익스트라 알고리즘은 못 쓰지만 플로이드 알고리즘은 사용할 수 있다.
사용전략
정점간 최단경로를 모두 구해야 한다. 1-2. 간선이 많지 않다: 플로이드 알고리즘은 V^3, 다익스트라 알고리즘은 VElogV 경우에 따라 다름 1-1. 간선이 매우 많다(V^2=E): 플로이드 알고리즘이 우수함. 시작점으로부터 나머지 정점까지 최단거리만 구해도 된다. 2-2. 간선이 많지 않다: 인접리스트를 이용하는 다익스트라 알고리즘을 사용한다. 2-1. 간선이 매우 많다(V^2=E): 인접행렬을 이용하는 다익스트라 알고리즘을 사용한다. 최단경로를 구하는 것이 전체 시간에 큰 영향을 끼치지 않는다: 소스가 간결한 플로이드 알고리즘을 사용한다. 그래프 간선에 음의 가중치가 존재한다: 다익스트라 알고리즘은 무조건 사용하지 못한다. 다른 최단경로 알고리즘과 비교한다.
[Algorithm] 미로의 최단거리 통로(BFS)
설명
7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요.
경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다.
출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.
격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면
위와 같은 경로가 최단 경로의 길이는 12이다.
입력
첫 번째 줄부터 7*7 격자의 정보가 주어집니다.
출력
첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.
풀이 과정.
좌표(1,1)부터 시작해서 상하좌우 0을 확인 후 Queue에 담으면서 진행.
위 그림좌표와 같은 크기의 2차원 확인배열 하나 만든다.
기존배열은 1칸 씩 이동할 때 마다 기존 좌표의 값을 1로 처리해준다.
확인배열은 1칸 씩 이동할 때 마다 기존 좌표의 값+1을 처리해준다. (좌표 0,0부터 1씩 누적 된다)
제일 먼저 좌표(7,7)에 도착하면 좌표 값을 1로 만들어 차후에 도착하는 친구?들은 도착하지 못하게 한다.
(최단거리는 이미 도착했으므로 차후 도착하는 친구들은 필요 없다. 단지 Queue만 비우기위해 반복된다.)
풀이.
public class Main { static class Point{ int x; int y; public Point(int x, int y){ this.x = x; this.y = y; } } static Queue
Q = new LinkedList<>(); static int[][] board; // 실제 좌표 값 배열 (지나간곳은 벽=1 처리) static int[][] dis; // 좌표 크기의 빈 배열 (거리 누적) static int[] dx = {-1, 1, 0, 0}; // 상 하 static int[] dy = {0, 0, -1, 1}; // 좌 우 static void BFS(int x, int y){ Q.offer(new Point(x,y)); // 시작점 1,1, 넣는다. board[x][y] = 1; // 시작점 벽 처리. while (!Q.isEmpty()){ Point temp = Q.poll(); // 큐에서 하나 꺼내고 for (int i = 0; i < 4; i++) { int nx = temp.x + dx[i]; int ny = temp.y + dy[i]; if(nx >= 1 && nx <= 7 && ny >=1 && ny <= 7 && board[nx][ny] == 0){ Q.offer(new Point(nx,ny)); // Q에서 넣고 board[nx][ny] = 1; // 벽 처리 dis[nx][ny] = dis[temp.x][temp.y]+1; // 거리누적 } } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); board = new int[8][8]; dis = new int[8][8]; for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 7; j++) { board[i][j] = sc.nextInt(); } } BFS(1,1); if(dis[7][7] == 0){ System.out.println("-1"); }else{ System.out.println(dis[7][7]); } } } 정리 : 마지막 좌표 7,7에 최초 도착 시 좌표값을 1로 처리하여 차후 도착하려는 친구들은 도착하지 못하도록 만든다.
[BFS] 미로 최단 거리 찾기
미로의 최단거리 통로(BFS 활용)
7*7 격자판 미로를 탈출하는 최단경로의 경로수를 출력하는 프로그램을 작성하세요. 경로수는
출발점에서 도착점까지 가는데 이동한 횟수를 의미한다. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.
격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면
위와 같은 경로가 최단 경로이며 경로수는 12이다.
▣ 입력설명
7*7 격자판의 정보가 주어집니다.
▣ 출력설명
첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.
▣ 입력예제 1
0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 1 0 0 0
1 0 0 0 1 0 0
1 0 1 0 0 0 0
▣ 출력예제 1
12
풀이
이 경우 BFS를 활용하면 되는데 각각의 시작점부터 거리를 기록해놓는 2차원 리스트가 중요합니다. -> dis 2차원리스트
또한, 이 경우에 왔던길을 되돌아가지 않아야 하므로 그에 대한 처리를 하지 않으면 무한 루프에 빠질 수 있습니다.
from collections import deque dx = [ – 1 , 0 , 1 , 0 ] dy = [ 0 , 1 , 0 , – 1 ] n = 7 board = [ list ( map ( int , input ( ) . split ( ) ) ) for _ in range ( n ) ] board [ 0 ] [ 0 ] = 1 dis = [ [ 0 ] * n for _ in range ( n ) ] deq = deque ( [ ( 0 , 0 ) ] ) while deq : x , y = deq . popleft ( ) for i in range ( 4 ) : new_x = x + dx [ i ] new_y = y + dy [ i ] if 0 <= new_x < n and 0 <= new_y < n and board [ new_y ] [ new_x ] == 0 : board [ new_y ] [ new_x ] = 1 deq . append ( ( new_x , new_y ) ) dis [ new_y ] [ new_x ] = dis [ y ] [ x ] + 1 for i in dis : print ( i ) if dis [ 6 ] [ 6 ] == 0 : print ( - 1 ) else : print ( dis [ 6 ] [ 6 ] ) 여기서 1번의 board[new_y][new_y] = 1은 왔던 길을 되돌아가지 않도록 하는 처리입니다. 2번은 이제 거리를 기록해 놓는 코드입니다. 이렇게 해서 모든 좌표의 거리는 dis 2차원 리스트에 담기게 됩니다. 도착점은 (6, 6) 고정이므로 출력은 dis[6][6]으로 출력하였고, 도착점에 갈 수 없을 때에는 dis[6][6] == 0이므로 -1을 출력하게 만들었습니다. 회고 사실 이 문제를 바로 풀지 못했습니다. 이 문제를 풀 때 문제였던 점은 왔던 길을 되돌아가지 않게 하려면 어떻게 할까? 어떻게 하면 최소 거리를 찾을 수 있을까? 이 두 가지 문제점을 제대로 해결하지 못했습니다. 하지만 지금 풀이를 보면 board에 1로 마킹 모든 거리를 dis 2차원 리스트에 저장
So you have finished reading the 좌표 최단 거리 알고리즘 topic article, if you find this article useful, please share it. Thank you very much. See more: 최단경로 알고리즘 종류, 그래프 최단 경로 알고리즘, 플로이드 최단 경로 알고리즘, 최단 경로 문제, 모든 쌍 최단 경로 알고리즘, 플로이드 워셜 알고리즘, C 미로 최단 경로, 다 익스트라 벨만 포드 시간 복잡도