문제: icpc.me/1799
한 지점에 비숍이 세워진다면 그 지점을 통과하는 두개의 대각선에 있는 모든 지점에는 비숍이 세워질 수 없다.
이를 이용하여 왼쪽 아래로 향하는 대각선과 오른쪽 아래로 향하는 대각선을 가르는 정점들에게 각각 대각선의 번호를 매겨준 뒤
두 대각선으로 이루어진 이분 그래프에서의 최대 매칭을 구하는 문제로 변형시켜서 해결할 수 있다.
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 | #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; int n, visited[60], b[60], a[11][11], c[11][11], d[11][11], cnt; int dx[] = { 1,1 }; int dy[] = { 1,-1 }; vector<vector<int>> vt; int chk(int x, int y) { return 0 <= x&&x < n && 0 <= y&&y < n; } int dfs(int here) { if (visited[here])return false; visited[here] = 1; for (auto next : vt[here]) { if (!b[next] || dfs(b[next])) { b[next] = here; return true; } } return false; } int solve() { int ret = 0; for (int i = 1; i <= cnt; i++) { memset(visited, 0, sizeof(visited)); if (dfs(i))ret++; } return ret; } int main() { scanf("%d", &n); vt.resize(4 * n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) scanf("%d", &a[i][j]); } for (int i = n - 1; i > 0; i--) { int x = i; int y = 0; cnt++; while (chk(x, y)) { c[x][y] = cnt; x += dx[0]; y += dy[0]; } } for (int i = 0; i < n; i++) { int x = 0; int y = i; cnt++; while (chk(x, y)) { c[x][y] = cnt; x += dx[0]; y += dy[0]; } } for (int i = 0; i < n; i++) { int x = 0; int y = i; cnt++; while (chk(x, y)) { d[x][y] = cnt; x += dx[1]; y += dy[1]; } } for (int i = 1; i < n; i++) { int x = i; int y = n - 1; cnt++; while (chk(x, y)) { d[x][y] = cnt; x += dx[1]; y += dy[1]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) if (a[i][j]) vt[c[i][j]].push_back(d[i][j]); } printf("%d\n", solve()); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)11689 GCD(n,k) = 1 (1) | 2017.06.10 |
---|---|
BOJ)2503 숫자 야구 (1) | 2017.06.08 |
BOJ)7154 Job Postings (0) | 2017.06.08 |
BOJ)12995 트리나라 (1) | 2017.06.08 |
BOJ)1405 미친 로봇 (0) | 2017.06.07 |