dfs版:
bool dfs(int u)
{
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(!vis[v]) {
vis[v] = true;
if(my[v] == -1 || dfs(my[v])) {
my[v] = u;
mx[u] = v;
return true;
}
}
}
return false;
}
int hungary()
{
int ret = 0;
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
for(int i = 1; i <= X; i++) {
if(mx[i] == -1) {
memset(vis, 0, sizeof(vis));
if(dfs(i)) ret++;
}
}
return ret;
}
bfs版:
bool bfs(int st)
{
queue <int> q;
q.push(st);
pre[st] = -1;
bool flag = false;
while(!q.empty() && !flag) {
int u = q.front(); q.pop();