因为匈牙利算法存储边为二维数组,本人怕其空间超限,所
以用邻接表来优化匈牙利算法。
#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int v[1000],u[1000],fir[1000],next[1000],f[1000],used[1000]; int n,m,bian; int Fin(int x) { int temp=fir[x]; while(temp!=0) { if(used[temp]==0) { used[temp]=1; if(f[u[temp]]==0||Fin(f[u[temp]])) { f[u[temp]]=x; return 1; } } temp=next[temp]; } return 0; } int main() { scanf("%d %d %d",&n,&m,&bian); memset(f,0,sizeof(f)); memset(v,0,sizeof(f)); memset(u,0,sizeof(f)); memset(fir,0,sizeof(f)); memset(next,0,sizeof(f)); for(int i=1;i<=bian;i++) { int a,b; scanf("%d %d",&a,&b); v[i]=a; u[i]=b; next[i]=fir[a]; fir[a]=i; } int ans=0; for(int i=1;i<=n;i++) { memset(used,0,sizeof(used)); if(Fin(i)) ans++; } printf("%d\n",ans); return 0; }
以用邻接表来优化匈牙利算法。