문제 : https://www.acmicpc.net/problem/18138
코드 : https://github.com/NaHwaSa/BOJ_BaekjunOnlineJudge/blob/master/18100/BOJ_18138.java
일단하나씩 매칭시키는 문제이니 이분 매칭 문제인건 알겠는데, 그래프에 간선이 없다. 그러니 로직은 간단히,
1. 입력을 받는다 (init())
2. 간선을 만든다 (makeEdge())
-> 이 때, w가 동일한게 안들어온다는 보장이 없으므로 w 대신 인덱스 번호로 새로 매칭시킨다. n개와 m개에 대해 0~n과 0~m을 노드로 하는 그래프로 바꾸면 된다. 간선을 만든 이후 w값은 필요없어진다. (62line)
3. 이분 매칭 돌린다 (matching())
이분 매칭의 경우, m을 n이 가진다고 보고(owner 배열 -> 각 m 노드에 대해 배열값은 주인인 n을 뜻함), 각 n에 대해 하나씩 m을 매칭시킨다. 이 때 onwer[target]==-1 (현재 주인이 없음) 이거나, matching(owner[target]) (현재 주인이 있지만, 그 주인이 다른 m을 가질 수 있음) 이면 해당 m을 소유하고 true를 return하는 식이다.
예를들어 '2. 간선을 만든다'의 결과로 N과 M의 각 노드가 다음과 같다고 하자.
1. 우선 N-0과 M-0이 매칭된다. (onwer[0] = 0;)
2. 다음으로 N-1이 M-0을 확인했는데 이미 매칭이 되었으므로 (owner[0]==-1이 false), 다시 matching(owner[0])이 돌아가고, N-0이 M-1과 매칭되도록 변경되고 N-1이 M-0과 매칭된다. (owner[1] = 0; owner[0] = 1;)
3. 다음으로 N-2가 M-0을 확인하는데 M-0이 이미 매칭되었으므로 matching(1)이 돌아간다. matching(1)에서 M-1을 확인하는데 다시 점유되어 있으므로 matching(0)이 다시 돌고, 최종적으로 N-0이 M-2과 매칭되고, N-1이 M-1과 매칭, N-2가 M-0과 매칭되면서 3개 다 매칭되게 된다.
이런 식으로 이분 매칭을 진행할 시 최대한 매칭이 될 수 있다.
'PS > BOJ' 카테고리의 다른 글
백준 11376 자바 - 열혈강호 2 (BOJ 11376 JAVA) (0) | 2021.10.17 |
---|---|
백준 11375 자바 - 열혈강호 (BOJ 11375 JAVA) (0) | 2021.10.16 |
백준 14217 자바 - 그래프 탐색 (BOJ 14217 JAVA) (0) | 2021.10.14 |
백준 1412 자바 - 일방통행 (BOJ 1412 JAVA) (0) | 2021.10.11 |
백준 3015 자바 - 오아시스 재결합 (BOJ 3015 JAVA) (4) | 2021.10.10 |
댓글