时间复杂度:O((√V)*E)
#include<stdio.h> #include<string.h> const int N=500,M=500,INF=0x3f3f3f3f; int dx[N],dy[M],sx[N],sy[M],p[N],q[N],a[N][M],l,r,n,m,d; int bfs() { l=r=0; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); int i,u;d=INF; for(i=1;i<=n;i++) { if(sx[i]==-1) { q[++r]=i; dx[i]=0; } } while(l<r) { u=q[++l]; if(dx[u]>d) break; for(i=1;i<=m;i++) { if(a[u][i]&&dy[i]==-1) { dy[i]=dx[u]+1; if(sy[i]==-1) d=dy[i]; else { dx[sy[i]]=dy[i]+1; q[++r]=sy[i]; } } } } return d!=INF; } int dfs(int u) { for(int i=1;i<=m;i++) { if(a[u][i]&&!p[i]&&dy[i]==dx[u]+1) { p[i]=1; if(sy[i]!=-1&&dy[i]==d) continue; if(sy[i]==-1||dfs(sy[i])) { sy[i]=u,sx[u]=i; return 1; } } } return 0; } int HK_maxMatch() { int ans=0,i; memset(sx,-1,sizeof(sx)); memset(sy,-1,sizeof(sy)); while(bfs()) { memset(p,0,sizeof(p)); for(i=1;i<=n;i++) { if(sx[i]==-1) { ans+=dfs(i); } } } return ans; }