zoukankan      html  css  js  c++  java
  • 匈牙利算法

    class Hungary {
    #define Hungary_MAX_Node 105
    #define Hungary_MAX_Edge 10005
    public:
        struct EDGE {
            int v;
            int next;
        } edge[Hungary_MAX_Edge];
        int head[Hungary_MAX_Node];
        int Left[Hungary_MAX_Node];
        bool vis[Hungary_MAX_Node];
        int N, M;
        Hungary() {
            clear();
        }
        void clear() {
            N = M = 0;
            memset(Left, 0, sizeof(Left));
            memset(head, -1, sizeof(head));
        }
        void addEdge(int a, int b) {
            edge[M].v = b;
            edge[M].next = head[a];
            head[a] = M++;
        }
        bool dfs(int u) {
            for (int e = head[u]; e != -1; e = edge[e].next) {
                int v = edge[e].v;
                if (!vis[v]) {
                    vis[v] = true;
                    if (!Left[v] || dfs(Left[v])) {
                        Left[v] = u;
                        return true;
                    }
                }
            }
            return false;
        }
        int Max_Match() {
            int ret = 0;
            for (int i = 1; i <= N; i++) {
                memset(vis, 0, sizeof(vis));
                if (dfs(i)) {
                    ret++;
                }
            }
            return ret;
        }
    };
    View Code

    N:点的数量
    M:边的数量
    void clear():清空数据结构
    void addEdge(int a, int b):添加一条a指向b的匹配
    int Max_Match():最大匹配

  • 相关阅读:
    perimeter of squares
    map
    django路由
    for的骚用法
    3和5的倍数相加和
    PeteCake 字典和最小值
    Find the missing letter
    实现简单的ssh功能
    开源运维工具体系
    vsftp在iptables中的配置
  • 原文地址:https://www.cnblogs.com/dramstadt/p/6266509.html
Copyright © 2011-2022 走看看