v个人,e条边,时间复杂度O(ve)
能匹配就尽量匹配,不能匹配就尽可能改变之前的匹配来使这次可以匹配
#include<cstdio> #include<cstring> using namespace std; int flg[1010],to[1010],mp[1010][1010]; int n,m,e,ans; bool find(int x) { for(int i=1;i<=m;i++) { if(mp[x][i]&&!flg[i]) { flg[i]=1; if(find(to[i])||(!to[i])) { to[i]=x; return 1; } } } return 0; } int main() { scanf("%d%d%d",&n,&m,&e); int a,b; for(int i=1;i<=e;i++) { scanf("%d%d",&a,&b); if(a>n||b>m) continue; mp[a][b]=1; } for(int i=1;i<=n;i++) { memset(flg,0,sizeof(flg)); if(find(i)) ans++; } printf("%d",ans); return 0; }