Hopcroft-Karp算法:
Hopcroft-Karp算法的思想与dinic类似,就是在分层图的基础上一次求多条不相交的最短路径,可以增明最多在√n次数内完成。这里只是上传一下模板,看讲解的可以略过。
Hopcroft-Karp模板:
/* 二分图Hopcroft-karp算法模板
* 使用前初始化G,uN赋值为左边节点的个数
* mx,my分别表示二分图左边和右边的匹配
* 时间复杂度:O(sqrt(V)*E)
*/
#define INF 0x3f3f3f3f
#define MAXN 3610
int uN;
int mx[MAXN],my[MAXN];
int dx[MAXN],dy[MAXN];
bool used[MAXN];
vector<int>G[MAXN];
int bfs()
{
memset(dx,-1,sizeof dx);
memset(dy,-1,sizeof dy);
queue<int>que;
int dis=INF;
for(int i=0;i<uN;i++)
if(mx[i]==-1) que.push(i),dx[i]=0;
while(!que.empty())
{
int f=que.front();que.pop();
if(dx[f]>dis) break;
for(int i=0;i<G[f].size();i++)
{
int to=G[f][i];
if(dy[to]==-1)
{
dy[to]=dx[f]+1;
if(my[to]==-1) {dis=dy[to];continue;}
if(dx[my[to]]==-1) {dx[my[to]]=dy[to]+1;que.push(my[to]);}
}
}
}
return dis!=INF;
}
bool dfs(int v)
{
used[v]=true;
for(int i=0;i<G[v].size();i++)
{
int u=G[v][i],w=my[u];
if(dy[u]==dx[v]+1&&(w<0||!used[w]&&dfs(w)))
{
mx[v]=u;
my[u]=v;
return true;
}
}
return false;
}
int max_match()
{
memset(mx,-1,sizeof mx);
memset(my,-1,sizeof my);
int res=0;
while(bfs())
{
memset(used,0,sizeof used);
for(int i=0;i<uN;i++)
if(mx[i]==-1&&dfs(i)) res++;
}
return res;
}