图片就是两个分配对象的小例子, 左边代表男生, 右边代表女生,最左边是我们的输入。
import java.util.*;
public class Main{
static int[][] graph; //图
static int[] match; //match[0] = 1 就是说顶点0和1匹配了 0 表示女生 1 表示男生
static boolean[] used; //表示已经增广过的点
static int boys, girls;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//多少组关系
boys = in.nextInt(); girls = in.nextInt();//多少个女生,多少个男生
//初始化
graph = new int[boys][girls]; match = new int[girls];
Arrays.fill(match, -1);
for (int i = 0; i < n; i++) {
int boy = in.nextInt(), girl = in.nextInt();
graph[boy - 1][girl - 1] = 1;
}
//实现
int ans = 0;
for (int i = 0; i < boys; i++) {
for (int j = 0; j < girls; j++) {
if(graph[i][j] == 1){
if(match[j] == -1){
ans++;
match[j] = i;
break;
}else{
used = new boolean[boys];
if(findAugmentPath(match[j], j)) {
match[j] = i;
ans++;
break;
}
}
}
}
}
System.out.println(ans);
}
//判断能否通过找到增广路线
static boolean findAugmentPath(int boy, int girl){
for (int i = 0; i < girls; i++) {
if(i == girl)
continue;
if(graph[boy][i] == 1){
if(!used[boy]){
used[boy] = true;
if(match[i] == -1 || findAugmentPath(match[i], i)){
match[i] = boy;
return true;
}
}
}
}
return false;
}
}