图论-匈牙利算法模板

upd: 单向连边 (a ightarrow b) ,显然应该在每一轮搜索中标记 (b) 集合的点。我误标记了 (a) ,这样就没有任何 (a) 类节点可以更改匹配了,完蛋。

    bool hungary(int p, int id)
    {
        for (int i = Fs[p]; i; i = Nx[i]) {
            int t = Vs[i];
            if (Mk[t] == id)
                continue;
            Mk[t] = id;
            if (!Lnk[t] || hungary(Lnk[t], id)) {
                Lnk[t] = p;
                return 1;
            }
        }
        return 0;
    }

    int main()
    {
        ans = 0;
        for (i = 1; i <= n; ++i)
            ans += hungary(i);
        printf("%d
", ans);
        return 0;
    }
原文地址:https://www.cnblogs.com/ghcred/p/10561143.html