题目:HDU2063 过山车
果然Hopcroft-Carp算法快,用匈牙利算法15ms,而Hopcorft-Carp却0ms。因为匈牙利算法的时间复杂度为O(n*e),而Hopcroft-Carp算法O(sqrt(n)*e)
本算法适合处理大一点的数据。。。。。。
#include <stdio.h> #include <iostream> #include <string.h> #include <queue> const int N=1005; const int INF=1<<28; int g[N][N]; int Mx[N]; int My[N]; int dx[N]; int dy[N]; bool used[N]; int Nx,Ny,dis; bool searchP() { dis=INF; int i,v,u; std::queue<int> Q; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); for(i=0;i<Nx;i++) { if(Mx[i]==-1) { Q.push(i); dx[i]=0; } } while(!Q.empty()) { u=Q.front(); Q.pop(); if(dx[u]>dis) break; for(v=0;v<Ny;v++) { if(g[u][v]&&dy[v]==-1) { dy[v]=dx[u]+1; if(My[v]==-1) dis=dy[v]; else { dx[My[v]]=dy[v]+1; Q.push(My[v]); } } } } return dis!=INF; } bool DFS(int u) { int v; for(v=0;v<Ny;v++) { if(g[u][v]&&!used[v]&&dy[v]==dx[u]+1) { used[v]=true; if(My[v]!=-1&&dy[v]==dis) continue; if(My[v]==-1||DFS(My[v])) { My[v]=u; Mx[u]=v; return true; } } } return false; } int Hungary() { int u; int ret=0; memset(Mx,-1,sizeof(Mx)); memset(My,-1,sizeof(My)); while(searchP()) { memset(used,false,sizeof(used)); for(u=0;u<Nx;u++) if(Mx[u]==-1&&DFS(u)) ret++; } return ret; } int main() { int k,u,v; while(~scanf("%d",&k),k) { scanf("%d%d",&Nx,&Ny); memset(g,0,sizeof(g)); Ny=Nx>Ny? Nx:Ny; while(k--) { scanf("%d%d",&u,&v); u--;v--; g[u][v]=1; } int ans=Hungary(); printf("%d\n",ans); } return 0; }