利用链式前向星存边,
match[j]:j点匹配的点
package Test;
//二分图最大匹配
import java.util.*;
public class 匈牙利算法 {
static int n, m, k, cnt = 0;
static int[] head = new int[505], e = new int[50005], next = new int[50005];
static boolean[] vis = new boolean[505];
static int[] match = new int[505];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
for (int i = 0; i < k; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
add(u,v); //有向图
}
int res = 0;
for (int i = 1; i <= n; i++) {
Arrays.fill(vis,false);
if (find(i)) res++;
}
System.out.println(res);
}
private static boolean find(int x) {
for (int i = head[x]; i > 0; i = next[i]) { //遍历边
int j = e[i];
if (vis[j] == false) { //未访问过
vis[j] = true; //记录状态为访问过
if (match[j] == 0 || find(match[j])) { //如果暂未匹配,或者原来匹配的左侧元素可以找到新的匹配
match[j] = x; //当前左侧元素成为当前右侧元素的新匹配
return true;
}
}
}
return false;
}
private static void add(int u, int v) {
e[++cnt] = v;
next[cnt] = head[u];
head[u] = cnt;
}
}
ji!