BFS breadth first search
๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ณผ์
๋ชจ๋ ์นธ์ด ํ์ 1๋ฒ์ฉ ๋ค์ด๊ฐ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ ์นธ์ด N๊ฐ์ผ ๋ O(N)
- ์์ํ๋ ์นธ์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ๋ค๋ ํ์ ๋จ๊ธฐ๊ธฐ
- ํ์์ ์์๋ฅผ ๊บผ๋ด์ด ๊ทธ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ ๋ํด (3)์ ์งํ
- ํด๋น ์นธ์ ์ด์ ์ ๋ฐฉ๋ฌธํ๋ค๋ฉด, ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ , ์ฒ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค๋ฉด ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊ธฐ๊ณ ํด๋น ์นธ์ ํ์ ์ฝ์
- ํ๊ฐ ๋น ๋๊น์ง (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. ๋ค์ฐจ์ ๋ฐฐ์ด์์์ ๊ฑฐ๋ฆฌ ์ธก์
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๋ฅผ ๋ชจ๋ ๋๋ฆผ
-
- ๋ถ์ ๋ํ bfs๋ฅผ ๋๋ ค์ ๊ฐ ์นธ์ ๋ถ์ด ์ ํ๋๋ ์๊ฐ์ ๋ฃ์ด๋๊ธฐ
-
- ์งํ์ด 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 |
๋๊ธ