• 二分图最大匹配


    二分图最大匹配,匈牙利算法

    用dfs找增广路得到最大匹配,即为匈牙利算法

    对于每一个左部点L1,如果能够在最大匹配的前提下找到一个右部点R1与之相连,

    这个右部点R1必须满足的条件是R1无边,或者当前与R1相连的左部点L2能找到另一个右部点R2和自己相连,让出R1给L1

    代码如下:

    #include <cstdio>
    #include <vector>
    
    using namespace std;
    
    int GtoB[505], id[505], vis[505];
    vector <int> ve[505];
    
    bool dfs(int u, int st)
    {
        if(id[u]==st)
            return 0;
        else
        {
            int i;
            id[u] = st;
            for(i=0; i<ve[u].size(); i++)
            {
                int v = ve[u][i];
                //左u与右v连边的条件是右v无边 或 与右v相连的另一点能找到其他的边
                if(!vis[v] || dfs(GtoB[v], st))
                {
                    vis[v] = 1;
                    GtoB[v] = u;
                    break;
                }
            }
            if(i<ve[u].size()) return 1;
            else return 0;
        }
    }
    
    int main()
    {
        int n, m, k, u, v, ans;
        scanf("%d %d %d", &n, &m, &k);
        while(k--)
        {
            scanf("%d %d", &u, &v);
            ve[u].push_back(v);
        }
        ans = 0;
        for(int i=1; i<=n; i++)
        {
            if(dfs(i, i))
                ans++;
        }
        printf("%d
    ", ans);
    }
  • 相关阅读:
    职场“潜”规则:心法和技法
    JVM参数配置
    python-编码
    pyserial库-串口通讯模块
    Arduino-舵机
    Arduino-中断
    Arduino-一些函数
    Arduino-位操作
    Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤
    MSYS2环境搭建
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/12789928.html
Copyright © 2020-2023  润新知