티스토리 뷰
반응형
BFS(Breath First Search)는 말그대로 너비를 우선 탐색한다.
DFS는 연결된 노드를 계속 들어가며 재귀호출하는 방식이었지만
BFS는 이와 달리 queue를 이용해서 루트노드에 연결되어있는 모든 노드를 다 탐색 후에 다음 깊이로 들어간다.
소스로 확인하면 다음과 같다.
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 29 30 31 32 33 34 35 | #include<iostream> #include<queue> using namespace std; int map[10][10]={0}; int visit[10]={0}; queue<int> q; int num; void bfs(int v){ cout<<v<<" "; q.push(v); while(!q.empty()){ int node = q.front(); q.pop(); for(int i=0;i<num;i++){ if(map[node][i]==1 && visit[i]==0){ visit[node]=1; cout<<i<<" "; q.push(i); } } } } int main(){ cin>>num; while(1){ int v1,v2; cin>>v1>>v2; if(v1==-1&&v2==-1) break; map[v1][v2]=map[v2][v1]=1; } bfs(1); return 0; } | cs |
위와같이 노드의 개수를 입력받고 -1,-1 을 입력하기 전까지 모든 노드를 입력받는다.
map이라는 배열을 통해 두 노드가 연결되어있으면 쌍방연결로 간주하고 map[v1][v2]=1로 입력한다.
bfs함수에서는 첫 시작 노드를 출력하고 q에 push해준다.
이후에 q가 비어있을때까지 while반복문을 통해 모든
이때 q에서 한 노드를 꺼내 그 노드를 기준으로 나머지 모든 노드를 탐색한다.
map배열로 연결되어있으면서 방문하지 않았던 노드가 있으면 해당 노드를 출력하고 q에 push한다.
이를 q가 비어있을때까지 반복하면 BFS방식으로 모든 노드를 탐색할 수 있다.
위와같이 연결된 그래프를 오른쪽 입력을 통해 구성하였다.
BFS방식을 적용하면 1 2 3 4 5 6 7 8 순서로 출력이 될 것이고 오른쪽 결과와 같이 잘 출력됨을 알 수 있다.
그래프출처 : swexpertacademy
반응형
'알고리즘&자료구조' 카테고리의 다른 글
[알고리즘]동적계획법 (Dynamic Programming) (0) | 2019.01.29 |
---|---|
[자료구조]C++ 이진트리 순회하기 (1) | 2019.01.25 |
[알고리즘]C++ DFS구현하기 (0) | 2019.01.22 |
[자료구조]C언어 연결리스트(linked list) 구현, 소스코드 (1) | 2018.01.09 |
[자료구조] C언어로 큐(Queue) , 원형 큐(Circular Queue) 구현, 소스코드 (19) | 2018.01.05 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday