zoukankan      html  css  js  c++  java
  • Hopcroft-Karp算法模版

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <cmath>
    using namespace std;
    const int maxn = 3010;
    const int INF = 1<<28;
    int dx[maxn], dy[maxn];
    int cx[maxn], cy[maxn];
    vector <int> G[maxn];
    int dis;
    int n, m;
    bool vis[maxn];
    bool search()
    {
    	queue <int> Q;
    	int dis = INF;
    	memset(dx, -1, sizeof(dx));
    	memset(dy, -1, sizeof(dy));
    	for(int i = 0; i < n; 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 = 0; i < G[u].size(); i++)
    		{
    			int v = G[u][i];
    			if(dy[v] == -1)
    			{
    				dy[v] = dx[u] + 1;
    				if(cy[v] == -1)
    					dis = dy[v];
    				else
    				{
    					dx[cy[v]] = dy[v] + 1;
    					Q.push(cy[v]);
    				}
    			}
    		}
    	}
    	return dis != INF;
    }
    
    bool dfs(int u)
    {
    	for(int i = 0; i < G[u].size(); i++)
    	{
    		int v = G[u][i];
    		if(vis[v])
    			continue;
    		vis[v] = true;
    		if(dy[v] == dx[u]+1)
    		{
    			if(cy[v] != -1 && dy[v] == dis)
    				continue;
    			if(cy[v] == -1 || dfs(cy[v]))
    			{
    				cy[v] = u;
    				cx[u] = v;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    int match()
    {
        int ans = 0;
        memset(cx, -1, sizeof(cx));
        memset(cy, -1, sizeof(cy));
        while(search())
        {
    		memset(vis, 0, sizeof(vis));
    		for(int i = 0; i < n; i++)
    			if(cx[i] == -1 && dfs(i))
    		    	ans++;
        }
        return ans;
    }
    


  • 相关阅读:
    对象数组深拷贝
    百度地图 轨迹
    vant mp-vue
    Nginx代理webSocket时60s自动断开, 怎么保持长连接
    python_传递任意数量的实参
    python_函数传递列表
    python_形参、实参
    python_函数、局部变量与全局变量
    python_三级字典
    python_字典的使用
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3833382.html
Copyright © 2011-2022 走看看