最大匹配和最小覆盖
二分图最大匹配
题目转载———caioj.cn
模板题(公牛母牛配)
题目描述
n n n只公牛和 m m m只母牛,
某些公牛和某些母牛互相喜欢。
但最后一只公牛只能和一只母牛建立一对一匹配。
要使得最后牛群匹配对数最大。
输入格式
第一行三个整数 n , m , k ( 1 ≤ n , m ≤ 1 0 4 , 0 < k ≤ 1 0 5 ) n,m,k(1\leq n,m\leq10^{4},0<k\leq10^{5}) n,m,k(1≤n,m≤104,0<k≤105)。
接下来 k k k行,每行两个整数 x , y , x,y, x,y,表示一条边,连接 X X X集合中 x x x点和 Y Y Y集合的 y y y点。
输出格式
只有一行。输出一个整数,表示牛群匹配对数最大值。
样例
输入
5 5 9
1 2
2 2
2 3
2 5
3 1
3 3
4 1
5 3
5 4
输出
5
算法讲解(重点)
此处引用老师的总结
公 牛 母 牛 配 公牛母牛配 公牛母牛配
— — 匈 牙 利 算 法 的 通 俗 解 释 ——匈牙利算法的通俗解释 ——匈牙利算法的通俗解释
二分图匹配问题是各类比赛的热门内容。涉及到的算法有:二分图最大匹配,二分图最佳匹配, K o ¨ n i g König Ko¨nig定理(最小覆盖问题)的证明与应用等等,但这些算法的根源在于匈牙利算法深透理解。
本文试图用通俗的讲解引导初学者了解匈牙利算法的操作细节。介于许多学生用交错轨解释匈牙利算法感到难以理解,本人写了这篇文章,算是一个尝试,希望给读者带来轻松的阅读。如果初学者看懂了这篇文章,还是要在百度查查关于匈牙利算法的专业描述,这样有助于后续内容的学习。
二分图:
顶点可以分类两个集合X和Y,所有的边关联的两个顶点,恰好一个属于集合X,另一个属于集合Y。图一般整理好之后如下:
最大二分匹配:
假设 X X X集合是公牛集合, Y Y Y集合是母牛集合,一条连接点 x i x_{i} xi到点 y i y_{i} yi的边,表示公牛 x i x_{i} xi可以和母牛 y i y_{i} yi可以配对。在一夫一妻制的前提下,求最大的配对数。这个问题可以用匈牙利算法解决。
【问题背景】
n只公牛和m只母牛,
某些公牛和某些母牛互相喜欢。
但最后一只公牛只能和一只母牛建立一对一匹配。
要使得最后牛群匹配对数最大。
【输入】
第一行三个整数 n , m , k ( 1 ≤ n , m ≤ 1 0 4 , 0 < k ≤ 1 0 5 ) n,m,k(1\leq n,m\leq10^{4},0<k\leq10^{5}) n,m,k(1≤n,m≤104,0<k≤105)。
下来 k k k行,每行两个整数 x , y , x,y, x,y,表示一条边,连接 X X X集合中 x x x点和 Y Y Y集合的 y y y点。
【输出】
只有一行。输出一个整数,表示牛群匹配对数最大值.
input:
5 5 9
1 2
2 2
2 3
2 5
3 1
3 3
4 1
5 3
5 4
output
5
匈牙利算法:公牛逐个找母牛匹配。公牛 x 1 x_1 x1与母牛 y 1 y_1 y1有匹配关系 ( m a p [ x 1 , y 1 ] = = t r u e ) , (map[x_1,y_1]==true), (map[x1,y1]==true),如果母牛 y 1 y1 y1尚未匹配 ( m a t c h [ y 1 ] = = 0 ) , (match[y_1]==0), (match[