二分图的最大匹配(匈牙利算法)

原创 2007年09月17日 04:57:00
看书看了好久,看不懂。
上网找代码研究,还是不懂。
突然瞄到书上的插图,顿悟,哈哈^_^
这里的代码修改了一些,贴上来。。


// 二分图的最大匹配(匈牙利算法)
#include <cstdio>
#include 
<memory.h>
using namespace std;

const int XV = 100;
const int YV = 300;
int xv, yv;        // X , Y 点集的大小
int adj [XV] [YV];    // adj [i] [j] != 0 表示 xi 与 yj 邻接
bool sy [YV];        // 每轮中对于被搜过的点 yi , sy [i] = 1
int xm [XV];        // xm [i] 保存 xi 匹配的 Y 点
int ym [YV];        // ym [i] 保存 yi 匹配的 X 点


int path (int u)
{
    
//对于 X 中的点 u ,返回能否找到增广路(也即能否增大匹配数,递归,时间复杂度 O (xv * yv))
    for (int v = 0; v < yv; v ++)
        {
        
if (adj [u] [v] && !sy [v])
            { 
            sy [v] 
= true;
            
if (ym [v] == -1 || path (ym [v]) == 1)
                {
                xm [u] 
= v;
                ym [v] 
= u;
                
return 1;
                } 
            }
        }
    
return 0;   
}

int maxmatch ()
{
    
int cnt = 0;            // 匹配数
    memset (xm, -1sizeof (xm));    // xm [i] == -1 表示 xi 尚未匹配
    memset (ym, -1sizeof (ym));
    
for (int u = 0; u < xv; u ++)
        {
        
if (xm [u] == -1)
            {
            memset (sy, 
0sizeof (sy));
            cnt 
+= path (u);
            }
        }
    
return cnt;
}

int main()
{
    scanf (
"%d%d"&xv, &yv);    // 输入 X , Y 点集的大小

    
// 输入邻接矩阵,两种方式

    
int edge;
    scanf (
"%d"&edge);        // 输入边数
    memset (adj, 0sizeof (adj));    
    
for (int i = 0; i < edge; i ++)
        {
        
int u, v;
        scanf (
"%d%d"&u, &v);    // 输入关联的两点
        adj [u] [v] = 1;
        }
    
/*
    6 6 10
    0 0
    0 2
    1 3
    1 5
    2 1
    2 3
    3 4
    4 4
    4 5
    5 5
    6 6
    
*/
/*************************************************
    for (int i = 0; i < xv; i ++)
        {
        for (int j = 0; j < yv; j ++)
            {
            scanf ("%d", &adj [i] [j]);
            }
        }
*/
/*    
    1 0 1 0 0 0
    0 0 0 1 0 1
    0 1 0 0 0 1
    0 0 0 0 1 0
    0 0 0 0 1 1
    0 0 0 0 0 1
*************************************************
*/

    
int cnt = maxmatch ();        // 匹配

    
// 打印
    printf ("The maxmatch count is %d ", cnt);
    
for (int i = 0; i < xv; i ++)
        {
        printf (
"%d ", xm [i]);
        }
    
return 0;
}

#1122 : 二分图二•二分图最大匹配之匈牙利算法

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了。因为过年时间...
  • wang2534499
  • wang2534499
  • 2015年07月25日 10:51
  • 443

二分图的最大匹配、完美匹配和匈牙利算法

二分图的最大匹配、完美匹配和匈牙利算法 2013-08-01Algorithms二分图匹配, 图论, 算法 这篇文章讲无权二分图(unweighted bipartite graph)的最...
  • pi9nc
  • pi9nc
  • 2013年09月20日 15:38
  • 63102

二分匹配总结(匈牙利算法+最大权+最小权)

转自:http://dingdongsheng.cool.blog.163.com/blog/static/1186187552009431405995/ 前段时间为了省赛,我专门花了半个月...
  • michaelhan3
  • michaelhan3
  • 2016年06月22日 10:28
  • 1590

二分图的基本概念+二分图的最大匹配问题(匈牙利算法)

今天学了二分图的最大匹配,其中的匈牙利算法。。哦不,其实远不止这个,还有后面的一系列KM、开花树啊什么的算法。反正又是一个异常懵逼的一天。。。 我觉得应该是上课前没有稍微预习一下这个算法是什么,了解个...
  • x_y_q_
  • x_y_q_
  • 2016年07月15日 20:05
  • 2437

二分图最大匹配问题与匈牙利算法的核心思想

最近在学习图论相关知识,读到二分图最大匹配问题的匈牙利算法,感觉很有意思,所以记录下来。 概念 在假设读者已经了解图论最最基本的概念的基础上(例如:顶点、边、路径、圈),我们先来看一下二分图特有的...
  • ctsas
  • ctsas
  • 2017年03月16日 13:17
  • 580

二分图匹配匈牙利算法(DFS, BFS两种实现模板)

3个重要结论: 最大匹配数:最大匹配的匹配边的数目 最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择 最大独立集:选取最多的点,使任意所选两点均不相连 最小路径覆盖数:对于一个...
  • qq_31281327
  • qq_31281327
  • 2017年07月28日 11:18
  • 314

求解二分图的最大匹配的匈牙利算法---POJ 1325 Machine Schedule

【基本概念】 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点...
  • u011523762
  • u011523762
  • 2016年07月27日 15:47
  • 385

二分图的最大匹配、完美匹配和匈牙利DFS算法

以下内容基本转载自Renfei Song's Blog。 这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perf...
  • qq_35935435
  • qq_35935435
  • 2017年02月07日 08:07
  • 349

求无权图的最大匹配---匈牙利算法

匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名,,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 【先介绍几...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年08月14日 16:40
  • 907

二分图最大匹配总结(匈牙利算法)

1、二分图    二分图的顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。    区别二分图,关键是看点集是否能分成两个独立的点集。同一个点集...
  • hmemoryl
  • hmemoryl
  • 2014年03月31日 18:21
  • 626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分图的最大匹配(匈牙利算法)
举报原因:
原因补充:

(最多只允许输入30个字)