///Hopcroft-Karp
///复杂度O(sqrt(n)*E)
///邻接表存图,vector实现
///vector先初始化,然后加入边
///uN为左端的顶点数,使用前赋值(点编号0开始)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int MAXN=1e5+5;
vector<int> G[MAXN];
int uN;
int Mx[MAXN],My[MAXN];
int dx[MAXN],dy[MAXN];
int dis;
bool used[MAXN];
bool searchP()
{
queue<int> Q;
dis=INF;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(int i=0;i<uN;i++)
{
if(Mx[i]==-1)
{
Q.push(i);
dx[i]=0;
}
}
while(!Q.empty())
{
int u=Q.front();
Q.pop();
if(dx[u]>dis) break;
int sz=G[u].size();
for(int i=0;i<sz;i++)
{
int v=G[u][i];
if(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 sz=G[u].size();
for(int i=0;i<sz;i++)
{
int v=G[u][i];
if(!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 maxMatch()
{
int res=0;
memset(Mx,-1,sizeof(Mx));
memset(My,-1,sizeof(My));
while(searchP())
{
memset(used,false,sizeof(used));
for(int i=0;i<uN;i++)
{
if(Mx[i]==-1&&dfs(i))
res++;
}
}
return res;
}
int main()
{
return 0;
}
Hopcroft-Karp算法
最新推荐文章于 2020-08-16 17:17:12 发布
本文介绍了一种高效的二分图最大匹配算法——Hopcroft-Karp算法,详细讲解了其核心思想与实现细节,并提供了完整的C++代码实现。该算法通过广度优先搜索寻找增广路径,利用交替路径优化匹配效率。
234

被折叠的 条评论
为什么被折叠?



