BFS . 5
BFS 구현 방법 : 1. Queue 로 구현
BFS (Breadth-First-Search) : 너비 우선 탐색 , 그래프에서 가까운 부분을 우선적으로 탐색하는 알고리즘 , 그래프 탐색
사용한 자료들 : 큐 , visited 배열 , 그래프 (ArrayList 클래스)
BFS 유형은 최단 거리 유형의 문제에 활용되기도 한다
모든 작업이 끝나면 큐 안은 비워져 있다.
import java.util.*;
public class Main {
public static boolean[] visited = new boolean[9]; // Main 클래스의 멤버변수
public static List<List<Integer>> graph = new ArrayList<>();
public static void main(String[] args) {
// 초기화 (0번 인덱스는 사용하지 않음)
for (int i = 0; i < 9; i++) {
graph.add(new ArrayList<>());
}
// 초기화 (간선 정보 추가)
graph.get(1).addAll(Arrays.asList(2, 3, 8));
graph.get(2).addAll(Arrays.asList(1, 7));
graph.get(3).addAll(Arrays.asList(1, 4, 5));
graph.get(4).addAll(Arrays.asList(3, 5));
graph.get(5).addAll(Arrays.asList(3, 4));
graph.get(6).addAll(Arrays.asList(7));
graph.get(7).addAll(Arrays.asList(2, 6, 8));
graph.get(8).addAll(Arrays.asList(1, 7));
// 각 리스트 정렬 (번호가 낮은 노드를 우선 방문하기 위함)
for (int i = 1; i <= 8; i++) {
Collections.sort(graph.get(i));
}
bfs(1); // BFS 실행
}
// BFS 함수 정의
public static void bfs(int start) { // 인스턴스 생성해서 호출하지 않고 static인 main메서드에서 바로 사용 가능하게 static으로 선언함
Queue<Integer> q = new LinkedList<>(); // Queue 사용 : LinkedList 클래스 사용
q.offer(start);
visited[start] = true;
while (!q.isEmpty()) {
int current = q.poll(); // 큐에서 삭제하면서 반환
System.out.print(current + " "); // 가로출력을 하기 위해 print 로 출력
for (int neighbor : graph.get(current)) { // 향상된 for문
if (!visited[neighbor]) {
visited[neighbor] = true;
q.offer(neighbor);
}
}
}
}
}
BFS 코드 예제 : DFS 와 마찬가지로 BFS 도 0번 인덱스를 비워두고, visited 배열의 요소를 9개로 선언한다
파이썬 예제
queue = deque([start]) # 시작 노드를 큐에 넣어준다
파이썬 deque 를 출력해보면 deque([1,2]) 이런 형태로 출력이 된다.
(큐의 요소 하나가 리스트 하나인 느낌)
while queue # 큐가 참일 때 --> 큐가 0이 아닐 때 --> 큐가 비어있지 않을 때
(popleft 함수는 반환까지 하는 함수인듯)
c++ 예제
c++ 에서 인접리스트 방식으로 그래프를 구현하고자 하면 vector를 이용해서
특정 노드에 연결되어 있는 인접 노드들의 리스트를 표현할 수 있다.
front(), push() 함수 활용
자바 예제
ArrayList 는 특정 인덱스에 접근하기 위해 상수시간이 소요되기 때문에 일반 배열보다 더 좋다
ArrayList를 중첩된 형태로 이용해서 그래프를 표현할 수 있다
자바에서는 LinkedList 로 구현된 큐를 이용한다.
offer : 큐에 요소를 추가하는 메서드 (rear 에서 자료 추가)
poll : 큐에서 가장 앞(front) 에 있는 요소를 꺼내고 삭제한다.
peek : 큐에서 가장 앞(front) 에 있는 요소를 제거하지 않고 조회합니다.
get : 리스트 계열 메서드 , 특정 인덱스의 요소를 가져온다.33
'자바에서 ArrayList를 이용할 때 특정 인덱스의 요소를 가져오기 위해서는 get 메서드를 사용해야 한다