int linker[N*2]; bool used[N*2]; vector<int>mp[N]; bool dfs(int u) { int len=mp[u].size(); for(int i=0;i<len;i++) { int v=mp[u][i]; if(!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return true; } } } return false; } int hungarian(int n) { int res=0; for(int i=0;i<=n*2;i++)linker[i]=-1; for(int u=1;u<=n;i++) { for(int i=1;i<=n*2;i++)used[i]=0; if(dfs(u))res++; } return res; }