반응형
개념
- 특정 노드에서 부터 가장 가까운 노드를 우선적으로 탐색하는 알고리즘.
- 탐색중인 정점의 연결된 노드에 방문한 적이 없다면 해당 노드를 큐에 삽입하고 방문 이력을 저장한다.
- 즉, 큐에서 값을 하나 꺼내고 그 값과 연결된 모든 노드를 방문하여 큐에 삽입하는 과정을 반복한다.
그래프 표현 - 인접행렬
static boolean[] check;
static int[][] map;
static void bfs(int start) {
Queue<Integer> q = new LinkedList<>();
q.offer(start);
check[start] = true;
while(!q.isEmpty()) {
int x = q.poll();
System.out.println(x);
for (int i = 0; i < map[x].length; i++) {
//현재 노드와 연결된 간선이 존재하는지 확인
int y = map[x][i];
//연결된 간선이 존재하고, 현재 그 노드가 방문을 한 상태가 아니면 큐에 담고 방문처리
if(map[x][i] == 1 && !check[i] ) {
q.offer(i);
check[i] = true;
}
}
}
}
public static void main(String[] args) throws IOException {
int[][] edgeArr = {
{1,2}
,{1,3}
,{2,3}
,{2,4}
,{3,5}
};
map = new int[6][6];
check = new boolean[6];
//간선 설정
for (int i = 0; i < edgeArr.length; i++) {
int temp1 = edgeArr[i][0];
int temp2 = edgeArr[i][1];
map[temp1][temp2] = map[temp2][temp1] = 1;
}
bfs(1);
}
※ 장점
- 모든 간선의 가중치가 동일할 경우 출발노드에서 목표노드까지의 최단 길이 경로를 보장할 수 있다.
(예) 미로찾기
※ 단점
- 노드의 수가 많을수록 많은 저장공간이 필요하다. (최악의 경우 거의 모든 노드에 대한 저장공간이 필요)
- 목표 노드가 깊은 단계에 있을 경우 오랜 시간이 소요된다.
반응형
'Algorithm > 기본' 카테고리의 다른 글
유니온 파인드(Union Find) (0) | 2021.05.12 |
---|---|
깊이 우선 탐색(Depth First Search, DFS) (0) | 2021.05.08 |
힙 정렬(heap sort) (0) | 2021.05.06 |
계수 정렬(counting sort) (0) | 2021.05.04 |
병합 정렬(merge sort) (0) | 2021.04.29 |