반응형
문제 출처 :
https://www.acmicpc.net/problem/1671
알고리즘 분석 :
문제 해결에 필요한 사항
1. 이분 매칭 :: http://www.crocus.co.kr/499
상어의 저녁식사 또한 이분 매칭 문제이다.
열혈강호2 문제와 똑같은 문제이니 이 문제를 푼다면 열혈강호2 문제도 풀어보길 바란다.
[11376번] 열혈강호 2 :: https://www.acmicpc.net/problem/11376
이 문제의 핵심은 A그룹(잡아먹는 그룹) B그룹(잡아먹히는 그룹)이 있다면
A그룹에서 B그룹으로 최대 두개의 간선을 뻗을 수 있다는 것이다.
즉, 1->2 1->3 2->4가 있다면
1은 2와 3으로 매칭이 가능하고 2는 4와 매칭이 가능하다는 것이다.
그 방식은 이분 매칭에서 dfs를 두번 돌리면 해결된다.
소스 코드 :
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 | #include <iostream> #include <cstdio> #include <vector> #include <memory.h> #define MAX_N 1002 using namespace std; typedef struct _JAWS_ { int size; int speed; int intel; }JAWS; int n; JAWS jaws[MAX_N]; bool adj[MAX_N][MAX_N]; int aMatch[MAX_N]; int bMatch[MAX_N]; int visit[MAX_N]; int visitCnt = 1; bool dfs(int a) { if (visit[a] == visitCnt) return false; visit[a] = visitCnt; for (int b = 1; b <= n; b++) { if (adj[a][b]) { if (bMatch[b] == -1 || dfs(bMatch[b])) { aMatch[a] = b; bMatch[b] = a; return true; } } } return false; } int bipartiteMatch() { int size = 0; memset(aMatch, -1, sizeof(aMatch)); memset(bMatch, -1, sizeof(bMatch)); for (int a = 1; a <= n; a++) { visitCnt++; size += dfs(a); visitCnt++; size += dfs(a); } return size; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { int size, speed, intel; scanf("%d %d %d", &size, &speed, &intel); jaws[i].size = size; jaws[i].speed = speed; jaws[i].intel = intel; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) continue; if (jaws[i].size == jaws[j].size && jaws[i].speed == jaws[j].speed && jaws[i].intel == jaws[j].intel && i > j) continue; if (jaws[i].size >= jaws[j].size && jaws[i].speed >= jaws[j].speed && jaws[i].intel >= jaws[j].intel) adj[i][j] = 1; } } int cnt = bipartiteMatch(); printf("%d\n", n - cnt); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1574번] 룩 어택 (0) | 2017.04.14 |
---|---|
[1760번] N-Rook (0) | 2017.04.14 |
[9576번] 책 나눠주기 (0) | 2017.04.14 |
[2573번] 빙산 (0) | 2017.04.14 |
[1600번] 말이 되고픈 원숭이 (0) | 2017.04.14 |