문제 : boj2188
완전 기본형태의 이분 매칭 문제이다. 이분 그래프임이 직관적으로 드러나므로 이분매칭 개념을 알고있다면 기본형 문제로 풀어볼만 하다.
'예제 입력 1'을 그려보면 다음과 같다.
이분 매칭된 결과 중 최대로 매칭 시킬 수 있는 경우의 예시는 다음과 같다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
ArrayList<Integer>[] edges;
private int[] matched;
private boolean[] v;
private boolean matching(int from) {
for (int to : edges[from]) {
if (v[to]) continue;
v[to] = true;
if (matched[to] == -1 || matching(matched[to])) {
matched[to] = from;
return true;
}
}
return false;
}
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
edges = new ArrayList[n];
for (int i = 0; i < n; i++) {
edges[i] = new ArrayList<>();
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
while (s-->0) edges[i].add(Integer.parseInt(st.nextToken())-1);
}
matched = new int[m];
Arrays.fill(matched, -1);
v = new boolean[m];
int cnt = 0;
for (int i = 0; i < n; i++) {
if (matching(i)) {
cnt++;
v = new boolean[m];
}
}
System.out.println(cnt);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 20949 자바 - 효정과 새 모니터 (BOJ 20949 JAVA) (0) | 2022.01.06 |
---|---|
백준 1298 자바 - 노트북의 주인을 찾아서 (BOJ 1298 JAVA) (0) | 2022.01.06 |
백준 1017 자바 - 소수 쌍 (BOJ 1017 JAVA) (0) | 2022.01.04 |
백준 18511 자바 - 큰 수 구성하기 (BOJ 18511 JAVA) (0) | 2022.01.03 |
백준 10867 자바 - 중복 빼고 정렬하기 (BOJ 10867 JAVA) (0) | 2022.01.02 |
댓글