匈牙利算法
简称NTR算法(滑稽=_=),是用来查找一个二分图中,最多能有多少相互匹配的边的数量(相互匹配的边,即该边和其他任何边都不共用同一个节点。)
算法设计
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n1,n2,m;
static int N=510,M=100010;
static int h[]=new int[N],e[]=new int[M],ne[]=new int[M],idx;
static boolean st[]=new boolean[N];
static int match[]=new int[N];
static void add(int a,int b) {
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
static boolean find(int x) {
for(int i=h[x];i!=-1;i=ne[i]) {
int j=e[i];
if(!st[j]) {
st[j]=true;
if(match[j]==0||find(match[j])) {
match[j]=x;
return true;
}
}
}
return false;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n1=sc.nextInt();n2=sc.nextInt();m=sc.nextInt();
Arrays.fill(h,-1);
for(int i=0;i<m;i++) {
int a;
int b;
a=sc.nextInt();
b=sc.nextInt();
add(a, b);
}
int res=0;
for(int i=1;i<=n1;i++) {
Arrays.fill(st, false);
if(find(i))res++;
}
System.out.println(res);
}
}