BFS(Breadth First Search) :๋๋น ์ฐ์ ํ์
-> ํน์ ์ ์ ์์ ์์ํด์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ ๋ฐฉ๋ฒ
์ ๊ฒฝ์ฐ๋ฅผ ๋ณด์! DFS์๋ค๋ฉด 1-2-3-5-4-6-7 ๋ก ํ ๋ฒ ๊ฐ ๊ธธ์ ๋๊น์ง ์ฐ๊ณ ๋์์ค๋ ๋ฐฉ์์ด๋ค. ๊ตณ์ด ์๊ธฐํ์๋ฉด ๊น๊ณ ์ข์ ๋๋?
๋ฐ๋ฉด BFS๋ ๋๊ณ ์์ ๋๋์ด๋ค! ((๊ฐ์ธ์ )) ๊ฐ๋ฆผ๊ธธ์ ๋ง๋๋ฉด ๋ ๊ตฐ๋ฐ ๋ชจ๋ ์์ ๊ฐ๋ค.
1->2 ๊น์ง ์์ ๋ 3์ผ๋ก ๊ฐ๋ ๊ฒ์ด ์๋๋ผ ๋๋ค๋ฅธ ๊ฐ๋ฆผ๊ธธ์ธ 4๋ก ๊ฐ๋ ๊ฒ์ด๋ค! ๊ทธ ๋ค์์๋ 2์์ ๊ฐ๋ฆผ๊ธธ์ธ 3๊ณผ 5๋ฅผ, ๊ทธ ๋ค์์๋ 4์์ ๊ฐ๋ฆผ๊ธธ์ธ 6๊ณผ 7์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค. ์ฆ, 1-2-4-3-5-6-7 ์์๋ก ๋ ธ๋๋ค์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด BFS๋ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น?
๋ฐ๋ก Queue(ํ) ์ด๋ค! ํ๋ ์ ์ ์ ์ถํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ปํ๋ค.
----------------
<-- 1 2 3 4 <--
----------------
์ด์ฒ๋ผ ๊ณต๊ฐ์ 1, 2, 3, 4 ์์ผ๋ก ๋ฃ์ผ๋ฉด, ๋์ค๋ ๊ฒ๋ 1, 2, 3, 4์ ์์๊ฐ ๋๋ค. ๋จผ์ ๋ค์ด๊ฐ ๊ฒ์ด ๋จผ์ ๋์ค๋ ๊ฒ!
์ด๊ฒ์ ๊ฐ์ง๊ณ BFS๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋๋~~ ํ๊ฐ BFS์์ ํ์ํ ์์ ์ ์ฅ ๊ณต๊ฐ์ด ๋ ๊ฒ ์ด ๋ค !
-----------
<-- 1 <--
-----------
๋จผ์ ๊ฐ์ฅ ์ฒ์ ๋ ธ๋์ธ 1๋ฒ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค.
<<1>>
------------------
<-- 2 4 <--
------------------
๊ทธ๋ฐ ๋ค์, ํ๋ฅผ dequeue์์ผ์ 1์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ 1๋ฒ ๋ ธ๋์ ์ธ์ ํ 2๋ฒ 4๋ฒ ๋ ธ๋๋ฅผ ํ์ ๋ฃ์ด์ค๋ค.
<<1 - 2>>
------------------
<-- 4 3 5 <--
------------------
๋ค์ ํ๋ฅผ dequeue ํ๋ฉด 2๊ฐ ๋ฟ ํ์ด๋์ค๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ฒ ๋ ธ๋์ ์ธ์ ํ 3๋ฒ 5๋ฒ ๋ ธ๋๋ฅผ ํ์ ๋ฃ์ด์ค๋ค.
์ด์ด์ ๊ฐ๋ณด์
<<1 - 2 - 4>>
----------------------
<-- 3 5 6 7 <--
----------------------
<<1 - 2 - 4 - 3>>
----------------------
<-- 5 6 7 <--
----------------------
์ด์ 3๋ฒ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ญ์ญ dequeue ํด์ค๋ค. ๊ทธ๋ฌ๋ฉด
<<1 - 2 - 4 - 3 - 5 - 6 - 7>>
์ ์์๋ก ์์๋ค์ ํ์ํ ์ ์๋ค!
+ ์ ์ฉํ STL
#include <queue> // ํค๋ํ์ผ ์ถ๊ฐ
//-queue : T type data๋ฅผ contain ํ๋ ์ ์
์ ์ถ(FIFO)ํ ์๋ฃ๊ตฌ์กฐ
queue< T > name //๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ธ
name.size() // name์ ๋ค์ด์๋ ์์์ ์ ๋ฐํ
name.empty() // name์ด ๋น์๋ค๋ฉด true, ์์ ์กด์ฌํ๋ฉด false
name.front() // name์ ์ฒซ๋ฒ์งธ ์์์ ์ ๊ทผ
name.push(T a) //name ๊ฐ์ฅ ๋ค์ a ์ถ๊ฐ(=enqueue)
name.pop() // name ๊ฐ์ฅ ์ ์์ ์ญ์
BFS ๊ตฌํํ๊ธฐ
- NODE๋ ์ด MAX๊ฐ(0 ~ MAX-1 ๋ฒ)
๊ฐ์ ์ ์ ๋ณด๋ adj๋ผ๋ vector์ adj list๋ก ์ ์ฅ๋จ
queue<int> q;
q.push(k);
visit[k] = 1;
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i=0; i<adj[cur].size(); i++){
if(visit[adj[cur][i]] == 0){
q.push(adj[cur][i]);
visit[adj[cur][i]] = 1;
}
}
}