MAX_N代表点数和边数中较大的值
int head[MAX_N],tot;
struct Edge{
int to,nxt;
}edge[MAX_N*2];
void init(){
tot=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v){
edge[tot].to=v;
edge[tot].nxt=head[u];
head[u]=tot++;
}
int linker[MAX_N];
bool used[MAX_N];
bool dfs(int u){
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].to;
if(!used[v]){
used[v]=true;
if(linker[v]==-1||dfs(linker[v])){
linker[v]=u;
linker[u]=v;
return true;
}
}
}
return false;
}
int hungary(){
int res=0;
memset(linker,-1,sizeof(linker));
for(int u=1;u<=n;u++){
if(linker[u]<0){
memset(used,false,sizeof(used));
if(dfs(u))res++;
}
}
return res;
}