果然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;
- }