匈牙利算法,A了一道板子题:http://acm.hdu.edu.cn/showproblem.php?pid=2063
推荐学习视频:https://www.bilibili.com/video/av16362938?t=767
import java.util.*;
import java.io.*;
public class Main {
static int maxn=600;
static int map[][];
static boolean used[];
static int next[];
static int n,m;
static boolean find(int x) {
for(int i=1;i<=m;i++) {
if(map[x][i]!=0&&!used[i]) {
used[i]=true;
if(next[i]==0||find(next[i])) {
next[i]=x;
return true;
}
}
}
return false;
}
static int match() {
int sum=0;
for(int i=1;i<=n;i++) {
used=new boolean[m+1];
if(find(i)) {
sum++;
}
}
return sum;
}
static void init() {
map=new int[n+1][m+1];
next=new int[m+1];
used=new boolean[m+1];
}
public static void main(String[] args) {
Scanner sc=new Scanner(new BufferedInputStream(System.in));
while(sc.hasNext()) {
int k=sc.nextInt();
if(k==0)return;
n=sc.nextInt();
m=sc.nextInt();
init();
while(k--!=0) {
int a=sc.nextInt();
int b=sc.nextInt();
map[a][b]=1;
}
System.out.println(match());
}
}
}