【二分图匹配】Hopcroft-Karp算法模板

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值