๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[ALPS Study] ํƒ์ƒ‰ - BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

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;
        }
    }
}