Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Algorithm
- LIS #Algorithm #요소추적
- Union-find
- 코딩테스트
- Smilegate
- 식단
- c++
- 카카오인턴
- 서버개발캠프
- 스마일게이트
- 코테
- 투포인터
- IBK기업은행 #기업은행 #디지털 #직무 #정리
- 삼성 #코테 #2020상반기 #c++
- 소감
- BaekJoon
- 유니온파인드
- 카카오
- 중반부
- 알고리즘
- 백준
- 보석쇼핑
- 1편
- BFS
Archives
- Today
- Total
짱아의 개발 기록장
백준 2146번. 다리 만들기(c++) / BFS 본문
반응형
설명 추가 예정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <iostream> #include <queue> #include <vector> #include <climits> #include <tuple> using namespace std; int n; int map[101][101] = { 0, }; int dx[4] = { 0, 0, -1, 1 }; int dy[4] = { -1, 1, 0, 0 }; int check[101][101] = { 0, }; // 영역 표시하기 int connectArea(vector<pair<int ,int>> &v, int num) { int visited[101][101] = { 0, }; queue<tuple<int, int, int>> q; for (int i = 0; i < v.size(); i++) { q.push(make_tuple(v[i].first, v[i].second, 1)); } while (!q.empty()) { int x, y, cnt; tie(x, y, cnt) = q.front(); q.pop(); visited[x][y] = true; for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (0 <= nx && nx < n && 0 <= ny && ny < n && !visited[nx][ny] && check[nx][ny]!=num) { if (map[nx][ny] == 0) { visited[nx][ny] = true; q.push(make_tuple(nx, ny, cnt + 1)); } else { return cnt; } } } } return 0; } int makeBridge() { int num = 0; int ans = INT_MAX; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (map[i][j]==0) continue; if (check[i][j] != 0) continue; int visited[101][101] = { 0, }; num++; queue<pair<int, int>> q; vector<pair<int, int>> edge; q.push(make_pair(i, j)); while (!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); visited[x][y] = true; check[x][y] = num; for (int k = 0; k < 4; k++) { int nx = x + dx[k]; int ny = y + dy[k]; if (0 <= nx && nx < n && 0 <= ny && ny < n && !visited[nx][ny]) { visited[nx][ny] = true; if (map[nx][ny] == 0) { edge.push_back(make_pair(nx, ny)); } if (map[nx][ny] == 1) { q.push(make_pair(nx, ny)); } } } } ans = min(ans, connectArea(edge, num)); } } return ans; } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } cout<<makeBridge()<<"\n"; return 0; } | cs |
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 1525번. 퍼즐(c++) / BFS (0) | 2021.03.31 |
---|---|
백준 9328번. 열쇠(c++) / BFS+비트마스크 (0) | 2021.03.30 |
백준 17472번. 다리 만들기2(c++) / BFS+유니온파인드 (0) | 2021.03.29 |
백준 17135번. 캐슬 디펜스(c++) / 구현 (0) | 2021.03.27 |
백준 16926번. 배열 돌리기1(c++) / 구현 (0) | 2021.03.25 |
Comments