반응형
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
- BFS
- boj #19237 #어른 상어
- Docker
- 연결요소
- 경력
- 백트래킹
- 소프티어
- msSQL
- 백준
- 성적평가
- 이분탐색
- compose
- 매개변수탐색
- @P0
- 파라메트릭
- dfs
- softeer
- 13908
- 오퍼레터
- 처우협의
- 처우산정
- upper_bound
- incr
- 6987
- 퇴사통보
- BOJ
- OFFSET
- Kafka
- 물채우기
- 기술면접
Archives
- Today
- Total
기술 블로그
1574번 룩 어택 본문
728x90
반응형
https://www.acmicpc.net/problem/1574
백트래킹 문제인줄 알았다.
이분 매칭 문제인데, 관련 문제들을 더 풀어 봐야겠다.
예제)
3 3 6
1 1
2 1
2 2
3 1
3 2
3 3
v[1] = {2, 3}
v[2] = {3}
행 열
1 2
2 3
이런 식으로 그림을 그려 보면서, 생각하면 된다. 이분 매칭.
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #include <iostream> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> #include <map> using namespace std; #define MAX 500 int R = 0, C = 0, N = 0; int Map[MAX][MAX] = { 0, }; int row[MAX][MAX] = { 0, }; // 이름을 헷갈리면 안 된다. int col[MAX][MAX] = { 0, }; // 이름을 헷갈리면 안 된다. int Left[MAX] = { 0, }; int Right[MAX] = { 0, }; bool visit[MAX] = { false, }; vector<int> v[MAX]; bool DFS(int start) { if (visit[start]) return false; visit[start] = true; for (auto next : v[start]) { if (Right[next] == -1 || DFS(Right[next])) { Left[start] = next; Right[next] = start; return true; } } return false; } int bm() { fill(Left, Left + MAX, -1); fill(Right, Right + MAX, -1); int ret = 0; // R을 '행'으로 보면 안 된다. for (int i = 1; i <= R; i++) { memset(visit, false, sizeof(visit)); if (DFS(i)) ++ret; } return ret; } int main(void) { for (int i = 0; i < MAX; i++) for (int j = 0; j < MAX; j++) Map[i][j] = 1; scanf("%d %d %d", &R, &C, &N); int y = 0, x = 0; for (int i = 0; i < N; i++) { scanf("%d %d", &y, &x); Map[y][x] = 0; // 빈 칸에는 룩을 둘 수 없다. } int cnt = 1; // 행 기준 넘버링 for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { row[i][j] = cnt; } ++cnt; } cnt = 1; // 열 기준 넘버링 for (int j = 1; j <= C; j++) // 인덱스 조심 { for (int i = 1; i <= R; i++) { col[i][j] = cnt; } ++cnt; } int r = 0, c = 0; for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { if (Map[i][j] == 1) { v[row[i][j]].push_back(col[i][j]); r = max(r, row[i][j]); c = max(c, col[i][j]); } } } // R과 C로 보면 안 된다. R = r; C = c; printf("%d\n", bm()); return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
16726번 영과일 학회방 (0) | 2019.01.04 |
---|---|
1014번 컨닝 (0) | 2019.01.03 |
4991번 로봇 청소기 (0) | 2019.01.03 |
16719번 ZOAC (0) | 2019.01.02 |
1764번 듣보잡 (0) | 2019.01.02 |