백준 풀이/자바(Java)
백준 11375 자바 - 열혈강호
콘스_
2023. 12. 29. 13:27
// 열혈강호
package Platinum_IV_4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Ex11375 {
static List<Integer>[] list;
static boolean[] check;
static int[] d;
public static void main(String[] args) throws IOException {
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()); // 일의 개수
list = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
list[i] = new ArrayList<>();
}
check = new boolean[m + 1];
d = new int[m + 1];
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
for (int j = 0; j < s; j++) {
list[i].add(Integer.parseInt(st.nextToken()));
}
}
int cnt = 0;
// 1 ~ n번 직원 순차대로 일 할당
for (int i = 1; i <= n; i++) {
Arrays.fill(check, false);
if (dfs(i)) cnt++; // 일이 할당 되었으면, cnt++
}
System.out.println(cnt);
}
static boolean dfs(int here) {
for (int nxt : list[here]) {
if (!check[nxt]) {
check[nxt] = true;
// 비어 있거나 점유 노드에 더 들어갈 공간이 있는 경우
if (d[nxt] == 0 || dfs(d[nxt])) {
d[nxt] = here;
return true;
}
}
}
return false;
}
}
위 코드는 해당 문제에서 사용되는 알고리즘인 이분 매칭을 알아보다가 비슷한 문제의 풀이를 제공하신 아래의 블로그를 보고 작성했다.
[알고리즘] 이분 매칭 (Bipartite Matching) 알고리즘 (Java) (tistory.com)
[알고리즘] 이분 매칭 (Bipartite Matching) 알고리즘 (Java)
매칭 문제 (Matching Problem) N명의 유치원생이 소풍을 가는데, 단독 행동을 막기 위해 둘씩 짝을 이뤄 같이 다니게 하려고 한다. 단 서로 사이가 안 좋은 학생끼리 짝을 지어 주면 떨어져서 따로 다
loosie.tistory.com
이 블로그에서는 2188번: 축사 배정 (acmicpc.net) 문제로 풀었는데 내가 푼 열혈강호 문제와 풀이 방법은 똑같은 듯했다. 이번 문제는 블로그를 보고 풀었지만, 다음에 축사 배정 문제는 안 보고 풀어 봐야겠다.