[백준-2146] 다리 만들기
in Coding Test on 백준
DFS와 BFS 모두 쓰면 연습이 잘 될 것 같아서 둘다 같이 써 보았다.
각각 대륙의 번호를 매길 때에는 DFS 대륙 사이의 다리를 연결 할 때에는 BFS를 사용하였다.
Code
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#define MAX 100
using namespace std;
struct yxc {
int y, x, c;
};
int N, mins = 99999;
int map[MAX][MAX];
bool check[MAX][MAX];
const int dy[] = { -1,1,0,0 }, dx[] = { 0,0,-1,1 };
void dfs(int y, int x, int cnt) {
map[y][x] = cnt;
check[y][x] = true;
for (int dir = 0; dir < 4; dir++) {
int ny = y + dy[dir], nx = x + dx[dir];
if (ny<0 || ny>N - 1 || nx<0 || nx>N - 1) continue;
if (map[ny][nx] && !check[ny][nx]) {
dfs(ny, nx, cnt);
}
}
}
int bridge(int cnt) {
queue<yxc> qs;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == cnt) {
check[i][j] = true;
qs.push({ i,j,0 });
}
}
}
int result = 0;
while (!qs.empty()) {
int cy = qs.front().y;
int cx = qs.front().x;
int count = qs.front().c;
qs.pop();
for (int dir = 0; dir < 4; dir++) {
int ny = cy + dy[dir], nx = cx + dx[dir];
if (ny<0 || ny>N - 1 || nx<0 || nx>N - 1) continue;
if (map[ny][nx] && map[ny][nx] != cnt) return count;
else if (!map[ny][nx] && !check[ny][nx]) {
check[ny][nx] = true;
qs.push({ ny,nx,count + 1 });
}
}
}
}
int main() {
int answer = 999999;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &map[i][j]);
}
}
int cnt = 1;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] && !check[i][j]) {
dfs(i, j, cnt);
cnt++;
}
}
}
for (int i = 1; i < cnt; i++) {
memset(check, false, sizeof(check));
answer = min(answer, bridge(i));
}
cout << answer << endl;
return 0;
}