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 }