zoukankan      html  css  js  c++  java
  • 二分图匹配(HopcroftCarp的算法)模版:

    /**********************************************
    二分图匹配(Hopcroft-Carp的算法)。
    初始化:g[][]邻接矩阵
    调用:res=MaxMatch(); Nx,Ny要初始化!!!
    时间复杂大为 O(V^0.5 E)

    适用于数据较大的二分匹配
    **********************************************
    */
    const int MAXN=3001;
    const int INF=1<<28;
    int g[MAXN][MAXN],Mx[MAXN],My[MAXN],Nx,Ny;
    int dx[MAXN],dy[MAXN],dis;
    bool vst[MAXN];
    bool searchP()
    {
    queue
    <int>Q;
    dis
    =INF;
    memset(dx,
    -1,sizeof(dx));
    memset(dy,
    -1,sizeof(dy));
    for(int i=0;i<Nx;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;
    for(int 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)
    {
    for(int v=0;v<Ny;v++)
    if(!vst[v]&&g[u][v]&&dy[v]==dx[u]+1)
    {
    vst[v]
    =1;
    if(My[v]!=-1&&dy[v]==dis) continue;
    if(My[v]==-1||DFS(My[v]))
    {
    My[v]
    =u;
    Mx[u]
    =v;
    return 1;
    }
    }
    return 0;
    }
    int MaxMatch()
    {
    int res=0;
    memset(Mx,
    -1,sizeof(Mx));
    memset(My,
    -1,sizeof(My));
    while(searchP())
    {
    memset(vst,
    0,sizeof(vst));
    for(int i=0;i<Nx;i++)
    if(Mx[i]==-1&&DFS(i)) res++;
    }
    return res;
    }

  • 相关阅读:
    Java经典编程题50道之四十一
    Java经典编程题50道之四十
    Java经典编程题50道之三十九
    Java经典编程题50道之三十八
    Java经典编程题50道之三十七
    Java经典编程题50道之三十六
    Java经典编程题50道之三十五
    前端学习之路之CSS (一)
    Numpy 01
    Python3 urllib 与 Python2 urllib的变化
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2135898.html
Copyright © 2011-2022 走看看