zoukankan      html  css  js  c++  java
  • 匈牙利算法-二分图最大匹配问题

    https://www.luogu.org/problemnew/show/P3386

    #include<cstdio>
    int e[1005][1005],match[1005],book[1005]; // match数组用来记录配对关系 
    int n,m,t;
    int dfs(int u)
    {
        for(int v=1; v<=m; v++)
        {
            if(book[v]==0&&e[u][v]==1)
            {
                book[v]=1; // 标记v点已经被访问 
                if(match[v]==0||dfs(match[v])) // 如果点v未被配对,或者点v的匹配对象找到了新的配对。 
                {
                    match[v]=u; // 更新配对关系 
                    return 1;
                }
            }
        }
        return 0;
    }
    int main()
    {
    
        int a,b;
        int sum=0;
        scanf("%d%d%d", &n, &m, &t);
        while(t--)
        {
            scanf("%d%d", &a, &b);
            if(a>n||b>m)
                continue;
            e[a][b]=1;
        }
        for(int i=1; i<=n; i++) // 判断每一个左边的点能不能与右边的点形成一个新的增广路(一条路径的起点、终点都是未被配对的点), 
        {
            for(int j=1; j<=n; j++)
                book[j]=0; // 清空上次搜索时的标记 
            if(dfs(i))
                sum++;// 可以的话匹配数+1。 
        }
        printf("%d", sum);
    }
  • 相关阅读:
    safeNet
    网店
    微信公众号自定义菜单与回车
    西游记对教育的启发
    zencart资源
    cmd批处理常用符号详解
    div垂直居中
    git工作量统计
    VS2012变化的快捷键:
    sql 树 递归
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10522305.html
Copyright © 2011-2022 走看看