๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ Algorithm/๐Ÿ•‍๐Ÿฆบ ๋ฐ”ํ‚น๋… ๊ฐœ๋…

[0x09] BFS

by nitronium102 2023. 6. 26.

BFS breadth first search

๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ณผ์ •

๋ชจ๋“  ์นธ์ด ํ์— 1๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์นธ์ด N๊ฐœ์ผ ๋•Œ O(N)

  1. ์‹œ์ž‘ํ•˜๋Š” ์นธ์„ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ ๋‚จ๊ธฐ๊ธฐ
  2. ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด์–ด ๊ทธ ์นธ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ์— ๋Œ€ํ•ด (3)์„ ์ง„ํ–‰
  3. ํ•ด๋‹น ์นธ์„ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด, ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ , ์ฒ˜์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ํ์— ์‚ฝ์ž…
  4. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ (2)๋ฅผ ๋ฐ˜๋ณต
// x๊ฐ€ ํ–‰, y๊ฐ€ ์—ด
#include <iostream>
#include <queue>
using namespace std;

#define X first
#define Y second // pair์—์„œ first, second๋ฅผ ์ค„์—ฌ์„œ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ

int board[502][502] = { ... }; // 1์ด ํŒŒ๋ž€ ์นธ, 0์ด ๋นจ๊ฐ„ ์นธ์— ๋Œ€์‘
bool vis[502][502]; // ํ•ด๋‹น ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅ

int n = 7, m = 10; // n = ํ–‰์˜ ์ˆ˜, m = ์—ด์˜ ์ˆ˜
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1}; // ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์„ ์˜๋ฏธ

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  queue<pair<int,int> > Q;

  vis[0][0] = 1; // (0, 0)์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋ช…์‹œ
  Q.push({0,0}); // ํ์— ์‹œ์ž‘์ ์ธ (0, 0)์„ ์‚ฝ์ž….

  while(!Q.empty()){
    pair<int,int> cur = Q.front(); Q.pop();

    cout << '(' << cur.X << ", " << cur.Y << ") -> ";

    for(int dir = 0; dir < 4; dir++){ // ์ƒํ•˜์ขŒ์šฐ ์นธ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.
      int nx = cur.X + dx[dir];
      int ny = cur.Y + dy[dir]; // nx, ny์— dir์—์„œ ์ •ํ•œ ๋ฐฉํ–ฅ์˜ ์ธ์ ‘ํ•œ ์นธ์˜ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด๊ฐ
      if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // ๋ฒ”์œ„ ๋ฐ–์ผ ๊ฒฝ์šฐ ๋„˜์–ด๊ฐ
      if(vis[nx][ny] || board[nx][ny] != 1) continue; // ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์นธ์ด๊ฑฐ๋‚˜ ํŒŒ๋ž€ ์นธ์ด ์•„๋‹ ๊ฒฝ์šฐ
      vis[nx][ny] = 1; // (nx, ny)๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋ช…์‹œ
      Q.push({nx,ny});
    }
  }
}

์‹ค์ˆ˜ ๋ชฉ๋ก

  1. ์‹œ์ž‘์ ์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ ๋‚จ๊ธฐ์ง€ ์•Š๊ธฐ
  2. ํ์— ๋„ฃ์„ ๋•Œ ๋ง๊ณ  ๋บ„ ๋•Œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ ๋‚จ๊ธฐ๊ธฐ → ๊ฐ™์€ ์นธ์ด ํ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋“ค์–ด๊ฐ€์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ
  3. ์ด์›ƒํ•œ ์›์†Œ๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€์— ๋Œ€ํ•œ ์ฒดํฌ๋ฅผ ์ž˜๋ชปํ–ˆ๋‹ค

1. ๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ์˜ ๊ฑฐ๋ฆฌ ์ธก์ •

ex) 2178 ๋ฏธ๋กœํƒ์ƒ‰ : ์‹œ์ž‘์ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ง‘์–ด๋„ฃ๋Š”๋‹ค

#include <iostream>
#include <queue>
using namespace std;

string board[MAX][MAX];
int dist[MAX][MAX];
int n, m;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

int main() {
	cin >> n >> m;

	for (int i=0; i<n; i++)
		cin >> board[i];

	for (int i=0; i<n; i++)
		fill(dist[i], dist[i]+m, -1);

	queue<pair<int, int>> q;
	q.push({0, 0});
	dist[0][0] = 0;
	while(!q.empty()){
		auto cur = q.front(); q.pop();
		for (int i = 0; i<4; i++){
			int nx = cur.first + dx[i];
			int ny = cur.second + dy[i];
			if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
			if (dist[nx][ny] >= 0 || board[nx][ny] != '1') continue;
			dist[nx][ny] = dist[cur.first][cur.second] + 1;
			q.push({nx, ny});
		}
	}
	cout << dist[n-1][m-1] + 1; // ๋ฌธ์ œ์˜ ํŠน์„ฑ ์ƒ ๊ฑฐ๋ฆฌ +1์ด ์ •๋‹ต
}

2. ์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ

๋ชจ๋“  ์‹œ์ž‘์ ์„ ํ์— ๋„ฃ๊ณ  bfs ๋Œ๋ฆฌ๊ธฐ

  • ํ์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ฑฐ๋ฆฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์Œ“์ธ๋‹ค!
// <https://www.acmicpc.net/problem/7576>
#include 
using namespace std;

#define X first
#define Y second
int board[1002][1002];
int dist[1002][1002];
int n,m;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> m >> n;
  queue<pair<int,int> > Q;
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      cin >> board[i][j];
      if(board[i][j] == 1)
        Q.push({i,j});
      if(board[i][j] == 0)
        dist[i][j] = -1;
    }
  }

  while(!Q.empty()){
    auto cur = Q.front(); Q.pop();
    for(int dir = 0; dir < 4; dir++){
      int nx = cur.X + dx[dir];
      int ny = cur.Y + dy[dir];
      if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
      if(dist[nx][ny] >= 0) continue;
      dist[nx][ny] = dist[cur.X][cur.Y]+1;
      Q.push({nx,ny});
    }
  }

  int ans = 0;
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      if(dist[i][j] == -1){
        cout << -1;
        return 0;
      }
      ans = max(ans, dist[i][j]);
    }
  }
  cout << ans;
}
</pair<int,int>

3. ์‹œ์ž‘์ ์ด ๋‘ ์ข…๋ฅ˜์ผ ๋•Œ

๋‘˜์˜ ์ „ํŒŒ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(A→B๋Š” ๊ฐ€๋Šฅํ•˜๋‚˜ B→A๋Š” ์•„๋‹ ๋•Œ)

ex) 4179 ๋ถˆ

  • ๋ถˆ์— ๋Œ€ํ•œ bfs์™€ ์ง€ํ›ˆ์ด์— ๋Œ€ํ•œ bfs๋ฅผ ๋ชจ๋‘ ๋Œ๋ฆผ
    1. ๋ถˆ์— ๋Œ€ํ•œ bfs๋ฅผ ๋Œ๋ ค์„œ ๊ฐ ์นธ์— ๋ถˆ์ด ์ „ํŒŒ๋˜๋Š” ์‹œ๊ฐ„์„ ๋„ฃ์–ด๋†“๊ธฐ
    1. ์ง€ํ›ˆ์ด bfs๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

๋‘˜์˜ ์ „ํŒŒ๊ฐ€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ

  • 18809 (๋ฐฑํŠธ๋ž˜ํ‚น๊นŒ์ง€)

์‹œ๊ฐ„ ์ˆœ์œผ๋กœ A์™€ B๋ฅผ ๋™์‹œ์— ์ „ํŒŒ์‹œ์ผœ์•ผ ํ•จ

4. 1์ฐจ์›์—์„œ์˜ BFS

  • 1697 : ์ˆจ๋ฐ”๊ผญ์งˆ

'โœจ Algorithm > ๐Ÿ•โ€๐Ÿฆบ ๋ฐ”ํ‚น๋… ๊ฐœ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[0x0A] DFS  (0) 2023.06.26
[0x08] ์Šคํƒ์˜ ํ™œ์šฉ(์ˆ˜์‹์˜ ๊ด„ํ˜ธ ์Œ)  (0) 2023.06.26
[0x07] ๋ฑ  (0) 2023.06.26
[0x06] ํ  (0) 2023.06.20
[0x05] ์Šคํƒ  (0) 2023.06.20

๋Œ“๊ธ€