二分图的最大匹配(匈牙利算法)
void solve(){
int n,m,l;cin>>n>>m>>l;
vector<vector<int>>gh(n+1);
for(int i=0;i<l;i++){
int u,v;cin>>u>>v;
gh[u].pb(v);
}
vector<int>vis(m+1);//标记右侧是否被访问过
vector<int>match(m+1);//标记是否有对象
auto dfs=[&](auto&&dfs,int u)->int{
for(auto&v:gh[u]){//遍历对象
if(vis[v]==1) continue;//上一个男生所dfs的女生
vis[v]=1;//否则给这个女生标记一下
if(!match[v]||dfs(dfs,match[v])){
match[v]=u;
return 1;
}
}
return 0;
};
int ans=0;
for(int i=1;i<=n;i++){
fill(vis.begin(), vis.end(), 0);
if(dfs(dfs,i)) ans++;
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号