33,006
社区成员
发帖
与我相关
我的任务
分享
/*
引用方法:
匈牙利算法的主要步骤为:
第一步:变换指派问题的效率矩阵C,使在各行各列都出现零元素,得到新的效率矩阵B = (bij)nn。
(1) 从系数矩阵的每行元素减去该行的最小元素;
(2) 再从所得系数矩阵的每列减去该列的最小元素。
第二步:进行试指派。
(1) 检查B的每行、每列,从中找出“0”元素最少的一排(行或列)。从这排中圈出一个“0”元素(如果该排存在多个“0”元素,则任圈一个),用“”表示,然后划去“”所在的行和列。在剩下的子矩阵中重复上述过程,直至剩下的子矩阵中没有“0”元素为止,得到的矩阵记为D。将D中“”所在的位置赋值“1”,其余位置赋值“0”,得到0—1矩阵E;
(2) 如果E中含有n个元素“1”(它们一定既不在同一行也不在同一列上),则矩阵E就是原指派问题的最优解矩阵,算法停止;否则,继续第三步。
第三步:作最小能覆盖所有零元素的直线集合。为此,按如下步骤对矩阵D进行操作:
(1) 对没有“”的行打 号;
(2) 对已打 号的行上的所有“0”元素所在的列打 号;
(3) 再对已打 号的列上有“”的行打 号;
(4) 重复 (2),(3) 直到得不出新的打 号的行列为止;
对没有打 号的行划横线,所有打 号的列划纵线,这就是能覆盖所有零元素的最小直线集合。
第四步:进行调整。
在没有被直线覆盖的部分元素中找出最小元素,对没有画直线的行的各元素都减去这最小元素。对已画直线的列的各元素都加上这最小元素,得到的新的效率矩阵仍记为B。转第二步。
*/