二分图的最大匹配(匈牙利算法)

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;

}
posted @ 2025-06-09 16:54  Qacter  阅读(9)  评论(0)    收藏  举报