1 int linker[MAXN * 2];
2 bool used[MAXN * 2];
3
4 bool dfs(int u) {
5 for (int i = h[u]; i; i = e[i].n) {
6 int v = e[i].t;
7 if (!used[v]) {
8 used[v] = 1;
9 if (linker[v] == -1 || dfs(linker[v])) {
10 linker[v] = u;
11 return 1;
12 }
13 }
14 }
15 return 0;
16 }
17
18 int hungarian(int n) {
19 int res = 0;
20 for (int i = 0; i <= n * 2; i++) {
21 linker[i] = -1;
22 }
23 for (int u = 1; u <= n; u++) {
24 for (int i = 1; i <= n * 2; i++) {
25 used[i] = 0;
26 }
27 if (dfs(u)) res++;
28 }
29 return res;
30 }