Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- bit manipulation
- Method
- 파이썬
- Matrix
- Math
- sorting
- 코딩테스트
- implement
- Tree
- SQL
- two pointers
- 코테
- Binary Tree
- string
- Binary Search
- java
- 자바
- database
- 구현
- hash table
- dynamic programming
- Class
- Stack
- Data Structure
- Number Theory
- Counting
- geometry
- array
- simulation
- greedy
Archives
- Today
- Total
코린이의 소소한 공부노트
Breadth First Search 본문
1. Problem
- root에 대하여 너비 우선 탐색을 실행해보자.
- 너비 우선 탐색은 깊이보다 너비(같은 레벨의 노드)를 우선적으로 탐색하는 알고리즘이다.
- 탐색 결과는 root에서 가까운 것부터 나오게 된다.
- 최단 경로를 보장해야 할 때 사용한다.
- 주로 큐로 구현한다.
2. Input
1) int[][] graph
- 노드 간의 연결성 표현
2) int root
- root 노드의 값
3. Output
1) root에 대하여 너비 우선 탐색을 실행한 결과
4. Example
// 예시: 위 그래프가 주어졌을 때, 1부터 차례대로 방문한다.
// 한 번 방문한 노드는 다시 방문하지 않는다. list queue
// 첫 번째로, 1을 방문한다. [1] []
// 1과 연결 되어 있는 노드 중 방문하지 않은 노드를 큐에 넣는다. [1] [2,3]
// 큐에서 2를 꺼낸다. [1,2] [3]
// 2와 연결 되어 있는 노드 중 방문하지 않은 노드를 큐에 넣는다. [1,2] [3,4]
// 큐에서 3을 꺼낸다. [1,2,3] [4]
// 3과 연결 되어 있는 노드 중 방문하지 않은 노드를 큐에 넣는다. [1,2,3] [4,6]
// 큐에서 4를 꺼낸다. [1,2,3,4] [6]
// 4와 연결 되어 있는 노드 중 방문하지 않은 노드를 큐에 넣는다. [1,2,3,4] [6,5]
// 큐에서 6을 꺼낸다. [1,2,3,4,6] [5]
// 6과 연결 되어 있는 노드 중 방문하지 않은 노드를 큐에 넣는다. [1,2,3,4,6] [5]
// 큐에서 5를 꺼낸다. [1,2,3,4,6,5] []
// 6과 연결 되어 있는 노드 중 방문하지 않은 노드를 큐에 넣는다. [1,2,3,4,6,5] []
// 큐가 비어있게 되면 탐색을 종료한다. [1,2,3,4,6,5]
// 같은 그래프에 대한 깊이 우선 탐색의 결과 [1,3,6,2,4,5]
5. Code
// 위 그래프를 2차원 배열로 표현
// graph[i][j] == 1 if (i+1)과 (j+1)이 직접 연결되어 있다면
// == 0 if 자기 자신이라면
// == -1 if (i+1)과 (j+1)이 직접 연결되어 있지 않다면
int[][] graph = {{0,1,1,-1,-1,-1},{1,0,1,1,-1,-1},{1,1,0,-1,-1,1},
{-1,1,-1,0,1,-1},{-1,-1,-1,1,0,-1},{-1,-1,1,-1,-1,0}};
boolean[] visited = new boolean[graph.length];
Queue<Integer> q = new LinkedList<>();
q.add(1); // root = 1
visited[0] = true;
while(!q.isEmpty()) {
int n = q.remove();
System.out.print(n+",");
for(int i=0 ; i<graph[n-1].length ; i++)
if(graph[n-1][i]==1 && !visited[i]) {
q.add(i+1);
visited[i] = true;
}
}
// 출력 결과: 1,2,3,4,6,5,
'Back-End > Algorithm' 카테고리의 다른 글
Union-find algorithm for graph (0) | 2023.05.31 |
---|---|
Depth First Search (0) | 2023.05.31 |
Counting sort (0) | 2023.05.24 |
Heap sort (0) | 2023.05.24 |
Insertion sort (0) | 2023.05.19 |