์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ (BFS)

2023. 11. 30. 14:23ใ†์ธํ”„๋Ÿฐ/์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„

728x90

 

https://hyejin.tistory.com/1264

 

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘๋ฆฌ์ŠคํŠธ) DFS

https://hyejin.tistory.com/1263 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘ํ–‰๋ ฌ) DFS https://hyejin.tistory.com/1262 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Grap

hyejin.tistory.com

-> ์ด์ „ ๋ฌธ์ œ ํ’€์ด 

 

 

13. ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ (BFS)

์„ค๋ช…

๋‹ค์Œ ๊ทธ๋ž˜ํ”„์—์„œ 1๋ฒˆ ์ •์ ์—์„œ ๊ฐ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ์ด๋™ ๊ฐ„์„ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.

 

 

์ž…๋ ฅ ์„ค๋ช…

์ฒซ์งธ ์ค„์—๋Š” ์ •์ ์˜ ์ˆ˜ N(1<=N<=20)์™€ ๊ฐ„์„ ์˜ ์ˆ˜ M๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ M์ค„์— ๊ฑธ์ณ ์—ฐ ๊ฒฐ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

 

์ถœ๋ ฅ ์„ค๋ช…

1๋ฒˆ ์ •์ ์—์„œ ๊ฐ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๊ฐ„์„ ์ˆ˜๋ฅผ 2๋ฒˆ ์ •์ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅํ•˜์„ธ์š”.

 

 

์ž…๋ ฅ ์˜ˆ์ œ 1

6 9

1 3

1 4

2 1

2 5

3 4

4 5

4 6

6 2

6 5

 

 

์ถœ๋ ฅ ์˜ˆ์ œ 1 

2 : 3

3 : 1

4 : 1

5 : 2

6 : 2

 

 

๋ฌธ์ œ ํ’€์ด 1 

public class GraphShortestDistance
{
   static int n, m = 0;
   static ArrayList<ArrayList<Integer>> graph;
   
   Queue<Integer> Q = new LinkedList<>();
   
   public int BFS(int v)
   {
      int L = 0; // root node level
      Q.offer(1);
      
      while (!Q.isEmpty())
      {
         int len = Q.size();
         for (int i = 0; i < len; i++)
         {
            int cur = Q.poll();
            if (cur == v) {
               return L;
            }else {
               for (int nv : graph.get(cur))
               {
                  if (nv == v) {
                     Q = new LinkedList<>();
                     return L + 1;
                  }
                     Q.offer(nv);
               }
            }
         }
         L++;
      }
      
      return L;
   }
   
   public static void main(String[] args)
   {
      GraphShortestDistance graphShortestDistance = new GraphShortestDistance();
      Scanner scanner = new Scanner(System.in);
      n = scanner.nextInt();
      m = scanner.nextInt();
      graph = new ArrayList<>();
      
      for (int i = 0; i  <= n; i++)
      {
         graph.add(new ArrayList<>());
      }
      
      for (int i = 0; i < m; i++)
      {
         int a = scanner.nextInt();
         int b = scanner.nextInt();
         
         graph.get(a).add(b);
      }
      
      for (int i = 2; i<= n; i++)
      {
         int result = graphShortestDistance.BFS(i);
         System.out.println(i + " : " + result);
      }
   }
}

๐Ÿ‘ฉ‍๐Ÿ’ป: ์œ„์˜ ํ’€์ด๋Š” ๋‚ด๊ฐ€ ํ‘ผ ํ’€์ด์ธ๋ฐ ๋‚˜๋Š” BFS ๋กœ ํ‘ผ๋‹ค๊ณ  ํ•˜๋‹ˆ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ level๋กœ ์ƒ๊ฐํ•ด์„œ ํ’€์—ˆ๋‹ค. 

-> ์ด๋Ÿฐ์‹์œผ๋กœ 1๋ฒˆ ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ 2๋ฒˆ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ณ , 

1๋ฒˆ ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ 3๋ฒˆ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ณ ... 

 

1๏ธโƒฃ

static int n, m = 0;
static ArrayList<ArrayList<Integer>> graph;

Queue<Integer> Q = new LinkedList<>();

๊ทธ๋ž˜์„œ ๋จผ์ € n์—๋Š” ์ž…๋ ฅ๋ฐ›์€ ์ •์ ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ , m์—๋Š” ์ž…๋ ฅ๋ฐ›์€ ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•ด์คฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—๋„ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Arraylist<Integer> ๋ฅผ ์ €์žฅํ•˜๋Š” Arraylist๋ฅผ ๋งŒ๋“ค์–ด์คฌ๋‹ค. 

BFS ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” Queue๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Q๋„ ์„ ์–ธํ•ด์คฌ๋‹ค.

(๊ทผ๋ฐ BFS ๋ฅผ ํ‘ผ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด Queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€๋Š” ์•„์ง ๋ชจ๋ฅด๊ฒ ๋‹ค.) 

 

 

1๏ธโƒฃ

for (int i = 0; i  <= n; i++)
{
   graph.add(new ArrayList<>());
}

for (int i = 0; i < m; i++)
{
   int a = scanner.nextInt();
   int b = scanner.nextInt();
   
   graph.get(a).add(b);
}

 

-> ๊ทธ ๋‹ค์Œ์—๋Š” graph์— n + 1 ๊ฐœ ๋งŒํผ Arraylist<Integer>๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต๋ฌธ์„ n+1๋งŒํผ ๋Œ๋ฉด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  m ๋งŒํผ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฉด์„œ graph์— ์ €์žฅ์„ ํ•ด์ฃผ๊ณ , 

 

for (int i = 2; i<= n; i++)
{
   int result = graphShortestDistance.BFS(i);
   System.out.println(i + " : " + result);
}

BFS๋ฅผ 2 ๋ถ€ํ„ฐ n๊นŒ์ง€ ๋Œ๋ฉด์„œ BFS ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ฐ›์€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

 

 

2๏ธโƒฃ

public int BFS(int v)
{
   int L = 0; // root node level
   Q.offer(1);
   
   while (!Q.isEmpty())
   {
      int len = Q.size();
      for (int i = 0; i < len; i++)
      {
         int cur = Q.poll();
         if (cur == v) {
            return L;
         }else {
            for (int nv : graph.get(cur))
            {
               if (nv == v) {
                  Q = new LinkedList<>();
                  return L + 1;
               }
                  Q.offer(nv);
            }
         }
      }
      L++;
   }
   
   return L;
}

์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ ˆ๋ฒจ๋กœ ๊ตฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € L ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ณ , Q ์— 1 ๊ฐ’์„ ๋จผ์ € offer ํ•ด์ค€๋‹ค. (๋ฌธ์ œ๊ฐ€ 1๋ฒˆ ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ด๋ฏ€๋กœ ์‹œ์ž‘์€ ๋ฌด์กฐ๊ฑด 1๋ฒˆ ์ •์ ์ž„) 

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ while๋ฌธ์€ queue ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

Q์˜ ์‚ฌ์ด์ฆˆ๋ฅผ len ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์ฃผ๊ณ , (๋ ˆ๋ฒจ L์— ํ•ด๋‹นํ•˜๋Š” ์ •์  ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜) 

for๋ฌธ์„ ํ†ตํ•ด len ๋งŒํผ ๋Œ๋ฉด์„œ Q ๋ฅผ ๊บผ๋‚ด๋Š”๋ฐ cur ๊ฐ’์ด v์™€ ๊ฐ™๋‹ค๋ฉด (์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ •์ ๊ณผ ๊ฐ™๋‹ค๋ฉด) ๊ทธ ์ž๋ฆฌ์—์„œ return L ํ•ด์ฃผ๋ฉด ๋˜๊ณ , ์•„๋‹ˆ๋ผ๋ฉด graph์—์„œ ์ด์ œ cur ๊ฐ’์„ ๊บผ๋‚ด์„œ(์ด์ œ ๋ ˆ๋ฒจ ํ•˜๋‚˜ +1๋˜๋Š” ๊ฑฐ์ž„)  nv๊ฐ€ v ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค. 

๋งŒ์•ฝ ๊ฐ™์œผ๋ฉด L +1 ํ•ด์„œ ๋ฆฌํ„ดํ•ด์ฃผ๋Š”๋ฐ ์ด๋•Œ Q ์— ๋‚จ์•„์žˆ๋Š” ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋‹ค์Œ 1๋ฒˆ ์ •์ ๋ถ€ํ„ฐ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ตฌํ•  ๋•Œ ๋นˆ Q ๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋˜๋ฏ€๋กœ Q ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. 

nv๊ฐ€ v๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๋ƒฅ Q ์— offer ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

๊ฐ™์€ ๋ ˆ๋ฒจ์— ๋“ค์–ด์žˆ๋˜ Q๋ฅผ ๋ชจ๋‘ ๊บผ๋ƒˆ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•˜๊ณ  L ++ ํ•ด์„œ ๋‹ค์Œ ๋ ˆ๋ฒจ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค. 

 

 

 

-> ์ด๋Ÿฐ์‹์œผ๋กœ ํ•ด์„œ 1๋ฒˆ ์ •์ ์—์„œ 2๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ ๊ฒƒ์ด๊ณ , 

3๋ฒˆ, 4๋ฒˆ, 5๋ฒˆ, 6๋ฒˆ ์ •์ ๋„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

๐Ÿ™„ ๊ทผ๋ฐ ๋‚ด๊ฐ€ ํ‘ผ ๋ฌธ์ œ๋Š” ๊ฐ”๋˜ ๋…ธ๋“œ๋ฅผ ํ™•์ธ์•ˆํ•ด์„œ ๋™์ผํ•œ ๋…ธ๋“œ๋ฅผ ๋˜ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ๋‹ค..! 

์ด ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์„œ ํ’€์–ด์•ผํ•  ๋“ฏ ํ•˜๋‹ค.. .

 

 

 

๋ฌธ์ œ ํ’€์ด 2

public class GraphShortestDistance2
{
   static int n, m;
   static ArrayList<ArrayList<Integer>> graph;
   static int[] ch, dis;
   
   public void BFS(int v)
   {
      Queue<Integer> queue = new LinkedList<>();
      ch[v] = 1;
      dis[v] = 0;
      queue.offer(v);
      
      while (!queue.isEmpty())
      {
         int cv = queue.poll();
         for (int nv : graph.get(cv))
         {
            if (ch[nv] == 0) { // ๋ฐฉ๋ฌธ ์•ˆํ–ˆ๋Š”๊ฐ€ ?
               ch[nv] = 1;
               queue.offer(nv);
               dis[nv] = dis[cv] + 1;
            }
         }
      }
   }
   
   public static void main(String[] args)
   {
      GraphShortestDistance2 graphShortestDistance2 = new GraphShortestDistance2();
      Scanner scanner = new Scanner(System.in);
      n = scanner.nextInt();
      m = scanner.nextInt();
      graph = new ArrayList<>();
      
      for (int i = 0; i <= n; i++)
      {
         graph.add(new ArrayList<>());
      }
      ch = new int[n + 1];
      dis = new int[n + 1];
      
      for (int i = 0; i < m; i++)
      {
         int a = scanner.nextInt();
         int b = scanner.nextInt();
         
         graph.get(a).add(b);
      }
      
      graphShortestDistance2.BFS(1);
      
      for (int i = 2; i<= n; i++)
      {
         System.out.println(i + " : " + dis[i]);
      }
      
   }
}

๐Ÿ‘พ : ๊ฐ•์‚ฌ๋‹˜์€ ๋ ˆ๋ฒจ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ์™„์ „!!! ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘ธ์…จ๋‹ค.. 

 

 

(๋ฐ‘์— ๊ทธ๋ฆผ์€ ๊ฐ•์˜ ๋ณด๊ณ  ๋‚ด๊ฐ€ ์บก์ณํ•œ ๊ทธ๋ฆผ) 

๋จผ์ € dis ๋ผ๋Š” ๋ฐฐ์—ด์„ ํ•˜๋‚˜ n+1 ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐ๊ฐ์—๋Š” 1๋ฒˆ ์ •์ ์—์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค ์ •์ ์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•œ๋‹ค. 

ex) dis[3]์˜ ์˜๋ฏธ๋Š” 1๋ฒˆ ์ •์ ์—์„œ 3๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

 

1๋ฒˆ ์ •์ ์—์„œ 3๋ฒˆ, 4๋ฒˆ ์ •์ ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” 1์ด๋ฏ€๋กœ 1์„ ์ €์žฅํ•ด์ค€๋‹ค. 

dis[3] = dis[1] + 1 

dis[4] = dis[1] + 1 

nv ๋Š” v์— ์—ฐ๊ฒฐ๋œ ๋‹ค์Œ ๋…ธ๋“œ (์ •์ )์„ ๋งํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  v์—๋Š” ํ˜„์žฌ ๋…ธ๋“œ์ด๋‹ค. 

-> 1๋ฒˆ ์ •์ ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ •์ ๋“ค์˜ ๊ธธ์ด๋ฅผ ๋ฐ‘์— ๊ณต์‹์œผ๋กœ ํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

dis[nv] = dis[v] + 1 

 

๊ทธ๋Ÿผ ์ด์ œ 3๋ฒˆ ๋…ธ๋“œ ๋จผ์ € ๋ณด๋ฉด 3๋ฒˆ ๋…ธ๋“œ๋Š” 4๋ฒˆ ๋…ธ๋“œ๋กœ ํ–ฅํ•˜๋Š”๋ฐ 4๋ฒˆ ๋…ธ๋“œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒจ์Šคํ•œ๋‹ค. 

๋‹ค์Œ 4๋ฒˆ ๋…ธ๋“œ๋Š” 5๋ฒˆ, 6๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ 

dis[5] = dis[4] + 1; 

dis[6] = dis[4] + 1; ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ 5๋ฒˆ ๋…ธ๋“œ๋Š” ์—ฐ๊ฒฐ๋œ ์ •์ ์ด ์—†์œผ๋ฏ€๋กœ ๋„˜์–ด๊ฐ€๊ณ , 6๋ฒˆ ๋…ธ๋“œ๋Š” 2๋ฒˆ, 5๋ฒˆ ๋…ธ๋“œ๋กœ ํ–ฅํ•˜๋Š”๋ฐ 

5๋ฒˆ ๋…ธ๋“œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ค‘์ด๋ฏ€๋กœ ๋„˜์–ด๊ฐ€๊ณ , 2๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ„๋‹ค. 

dis[2] = dis[5] + 1; 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 1๋ฒˆ ๋…ธ๋“œ์—์„œ ๊ฐ ๋…ธ๋“œ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ dis ๋ฐฐ์—ด์„ ์–ป๊ฒŒ ๋˜๊ณ , 

์ด ๋ฐฐ์—ด์„ ๋ฉ”์ธ์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

0๏ธโƒฃ

static int n, m;
static ArrayList<ArrayList<Integer>> graph;
static int[] ch, dis;

 

n, m, graph๋Š” ๋‚˜์™€ ๋™์ผํ•˜๊ณ , ๊ฐ•์‚ฌ๋‹˜์€ ch, dis  static int ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์คฌ๋‹ค. 

 

 

1๏ธโƒฃ

for (int i = 0; i <= n; i++)
{
   graph.add(new ArrayList<>());
}
ch = new int[n + 1];
dis = new int[n + 1];

for (int i = 0; i < m; i++)
{
   int a = scanner.nextInt();
   int b = scanner.nextInt();
   
   graph.get(a).add(b);
}

graphShortestDistance2.BFS(1);

for (int i = 2; i<= n; i++)
{
   System.out.println(i + " : " + dis[i]);
}

๊ทธ๋ฆฌ๊ณ  main ๋ฉ”์„œ๋“œ์—์„œ ์ž…๋ ฅ๋ฐ›์€ n์„ ํ†ตํ•ด ch์™€ dis ๋ฐฐ์—ด์„ n+1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. (์ธ๋ฑ์Šค 0์€ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด์„œ) 

BFS ๋ฉ”์„œ๋“œ๋ฅผ 1๋กœ ์ง€์ •ํ•ด์„œ dis ๋ฐฐ์—ด์— 1๋ฒˆ ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๊ณ , 

์ด ๋ฐฐ์—ด์„ for๋ฌธ์„ ํ†ตํ•ด ์ถœ๋ ฅ ์˜ˆ์‹œ์— ๋งž๊ฒŒ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

2๏ธโƒฃ

public void BFS(int v)
{
   Queue<Integer> queue = new LinkedList<>();
   ch[v] = 1;
   dis[v] = 0;
   queue.offer(v);
   
   while (!queue.isEmpty())
   {
      int cv = queue.poll();
      for (int nv : graph.get(cv))
      {
         if (ch[nv] == 0) { // ๋ฐฉ๋ฌธ ์•ˆํ–ˆ๋Š”๊ฐ€ ?
            ch[nv] = 1;
            queue.offer(nv);
            dis[nv] = dis[cv] + 1;
         }
      }
   }
}

 

๊ทธ๋ฆฌ๊ณ  BFS ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•œ Queue๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ , ch[v] ์ฆ‰ ch[1] = 1, dis[1] = 0 ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. 

dis[1]์„ 0์œผ๋กœ ํ•˜๋Š” ์ด์œ ๋Š” 1๋ฒˆ ๋…ธ๋“œ ์ž์‹ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๋ฆฌ๋Š” 0์ด๋‹ค! 

๋‹ค์Œ queue์— 1 ๋…ธ๋“œ๋ฅผ offer ํ•ด์ค€๋‹ค. 

 

while๋ฌธ์„ queue๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค. 

queue์—์„œ ๊บผ๋‚ธ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ cv๋ผ๊ณ  ํ•˜๊ณ , 

cv์˜ ๋…ธ๋“œ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ graph์—์„œ getํ•ด์„œ ๋…ธ๋“œ๋“ค์„ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๊บผ๋‚ธ๋‹ค. 

์ด๋•Œ cv์—์„œ ๋‹ค์Œ๊ฐ’ nv๊ฐ€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ด๋ฉด (ch[nv] == 0) ch[nv]๋ฅผ 1๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ , queue์— offer ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  dis[nv]์— dis[cv] + 1 ๊ฐ’์„ ์ €์žฅํ•ด์ค€๋‹ค. 

 

 

728x90

'์ธํ”„๋Ÿฐ > ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch08. DFS, BFS ํ™œ์šฉ : ๋ฐ”๋‘‘์ด ์Šน์ฐจ DFS  (1) 2023.12.05
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch08. DFS, BFS ํ™œ์šฉ : ํ•ฉ์ด ๊ฐ™์€ ๋ถ€๋ถ„ ์ง‘ํ•ฉ (DFS, ์•„๋งˆ์กด ์ธํ„ฐ๋ทฐ)  (1) 2023.12.01
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘๋ฆฌ์ŠคํŠธ) DFS  (0) 2023.11.29
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ๊ฒฝ๋กœ ํƒ์ƒ‰ (์ธ์ ‘ํ–‰๋ ฌ) DFS  (0) 2023.11.28
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : Tree ๋ง๋‹จ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ (BFS)  (0) 2023.11.27