二分图匹配模板
#include<bits/stdc++.h> using namespace std; int edge[1005][1005]; int match_x[1005]; int match_y[1005]; int book[1005]; int n,m,e; int dfs(int u) { for(int i=1;i<=m;i++) { if(book[i]==0&&edge[u][i]==1)//有边且没有访问过 { book[i]=1; if(match_y[i]==0||dfs(match_y[i]))//y没有匹配或者y的男友找到了增广路 { match_x[u]=i; match_y[i]=u;//此模板要分开标记配对,因为男女编号相同 return true; } } } return false; } int main() { ios::sync_with_stdio(false); cin>>n>>m>>e; for(int i=1;i<=e;i++) { int a,b; cin>>a>>b; if(a>=1&&b>=1&&a<=n&&b<=m)//卡掉奇怪的数据 { edge[a][b]=1;//只需要从男友开始找增广路 //edge[b][a]=1; } } int ans=0; for(int i=1;i<=n;i++) { memset(book,0,sizeof(book));//清空访问过的标记 if(dfs(i)) ans++; } cout<<ans<<endl; return 0; }//当且仅当无向图G的回路个数为偶数时,图G为一个二分图。