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

原创 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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用匈牙利算法求二分图的最大匹配

文章转自博客:http://ycool.com/post/cfnym64 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是...

HDOJ 2063 过山车【匈牙利算法求二分图最大匹配 DFS增广 BFS增广】

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...

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

1、二分图    二分图的顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。    区别二分图,关键是看点集是否能分成两个独立的点集。同一个点集...

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

【基本概念】: 二分图: 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和...

NYOJ 月老的难题 (最大二分图匹配,匈牙利算法)

题目链接;http://acm.nyist.net/JudgeOnline/problem.php?pid=239 月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度...

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

转自:点击打开链接 用匈牙利算法求二分图的最大匹配 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流...

用匈牙利算法求二分图的最大匹配

什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识);第二种就是我现在要讲的匈牙利算法。这个算法说白...

HDU 2063 过山车(匈牙利算法)(二分图求最大匹配)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...

HDU 2063 过山车 【匈牙利算法,二分图最大匹配】

二分图最大匹配入门题,话不多说,看代码。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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