码迷,mamicode.com
首页 > 编程语言 > 详细

Hopcroft-Carp 算法模板 自用

时间:2018-06-12 13:35:18      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:max   define   模板   AC   col   space   pcr   算法   empty   

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 500, INF = 0xfffffff;
int cx[maxn], cy[maxn], dx[maxn], dy[maxn], used[maxn], g[maxn][maxn];
int nx, ny, dis;
int bfs()
{
    queue<int> Q;
    dis = INF;
    mem(dx,-1);
    mem(dy,-1);
    for(int i=1; i<=nx; i++)
    {
        if(cx[i] == -1)
        {
            Q.push(i);
            dx[i] = 0;
        }
    }

    while(!Q.empty())
    {
        int u = Q.front(); Q.pop();
        if(dx[u] > dis) break;
        for(int i=1; i<=ny; i++)
        {
            if(g[u][i] && dy[i] == -1)
            {
                dy[i] = dx[u] + 1;
                if(cy[i] == -1) dis = dy[i];
                else
                {
                    dx[cy[i]] = dy[i] + 1;
                    Q.push(cy[i]);

                }
            }
        }
    }
    return dis != INF;
}

int dfs(int u)
{
    for(int i=1; i<=ny; i++)
    {
        if(g[u][i] && !used[i] && dy[i] == dx[u] + 1)
        {
            used[i] = 1;
            if(cy[i] != -1 && dis == dy[i]) continue;
            if(cy[i] == -1 || dfs(cy[i]))
            {
                cy[i]= u;
                cx[u] = i;
                return 1;
            }
        }
    }
    return 0;
}
int hc()
{
    int res = 0;
    mem(cx,-1);
    mem(cy,-1);
    while(bfs())
    {
        mem(used,0);
        for(int i=1; i<=nx; i++)
        {
            if(cx[i] == -1 && dfs(i))
                res++;
        }
    }
    return res;
}
int main()
{




    return 0;
}

 

Hopcroft-Carp 算法模板 自用

标签:max   define   模板   AC   col   space   pcr   算法   empty   

原文地址:https://www.cnblogs.com/WTSRUVF/p/9172511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!