Poj1469_匈牙利算法_最大二分匹配

这道题是一个基本的匈牙利算法,求最大二分匹配。之前在算法导论中学习网络流,明白了网络流中的残留网络,增光路和割,但是去模拟书上的伪代码感觉很是费力。就打算从最基本的匈牙利算法做起。

下面先介绍一下匈牙利算法:

该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法:

匹配是边集的子集。

设M是图G的一个匹配,需要掌握一下几个概念:

1.M-交错路:M-交错路是一条通路,这条通路中的边为属于M与不属于M但属于G的边交替出现。

2.M-饱和点:M-饱和点是与M中的某条边相关联的点。否则是非M-饱和点。

3.M-可增广路:M-交错路的起点和终点都是非M-饱和点。

设P是M-可增广路,则可以得出以下三个结论:

1.p的路径个数为奇数,并且首尾两条边是不属于M

2.p取反可以得到更大的匹配。

3.M是最大匹配当且仅当不存在M的增广路径。

所以算法就是不断的找出增广路径,知道找不出为止。

 

这道题我用的数据结构是二维数组,这样的话,设n为人数,p为课程数.

空间复杂度为O(n^2),而时间复杂度为o(p*n*n),其中最坏情况下寻找增广路的时间复杂度为o(n)。

以后再给出用邻接表的分析。

需要注意的是,读题的时候以为课程数和学生数要相等,但后来仔细读题发现Each student visits zero, one or more than one courses.说明可以有学生不匹配某个课程。这样看来结果就清楚了,得出的最大二分匹配与课程数比较即可。

还有就是这么多数据的读入,用cin会超时的,之前也遇到这样的问题,好在这次没有在这上面出bug。

以下是代码:

View Code

这个题也是tju oj1050

这个题有一个小小的优化:

题目要求找对课程的完全匹配,当对课程进行遍历的时候,如果某个课程找匹配失败,就可以结束遍历。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值