匈牙利算法及程序
匈牙利算法及程序
匈牙利算法自然避不开Hall定理,即是:对于二部图G,存在一个匹配M,使得X的所有顶点关于M饱和的充要条件是:对于X的任意一个子集A,和A邻接的点集为T(A),恒有: │T(A)│ >= │A│
匈牙利算法是基于Hall定理中充分性证明的思想,其基本步骤为:
1.任给初始匹配M;
2.若X已饱和则结束,否则进行第3步;
3.在X中找到一个非饱和顶点x0,作V1 ← {x0}, V2 ← Φ;
4.若T(V1) = V2则因为无法匹配而停止,否则任选一点y ∈T(V1)\V2;
5.若y已饱和则转6,否则做一条从x0 →y的可增广道路P,M←M?E(P),转2;
6.由于y已饱和,所以M中有一条边(y,z),作 V1 ← V1 ∪{z}, V2 ← V2 ∪ {y}, 转4;
设数组up[1..n] --- 标记二分图的上半部分的点。
down[1..n] --- 标记二分图的下半部分的点。
map[1..n,1..n] --- 表示二分图的上,下部分的点的关系。
True-相连, false---不相连。
over1[1..n],over2[1..n] 标记上下部分的已盖点。
use[1..n,1..n] - 表示该条边是否被覆盖 。
首先对读入数据进行处理 ,对于一条边(x,y) ,起点进集合up,终点进集合down。 标记map中对应元素为true。
1. 寻找up中一个未盖点 。
2. 从该未盖点出发 ,搜索一条可行的路线 ,即由细边出发, 由细边结束, 且细粗交错的路线 。
3. 若找到 ,则修改该路线上的点所对应的over1,over2,use的元素。重复步骤1。
4. 统计use中已覆盖的边的条数total,总数n减去total即为问题的解。
匈牙利算法
开放分类: 算法、数据结构、离散数学、二分图匹配
求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。但是这个算法的时间复杂度为边数的指数级函数。因此,需要寻求一种更加高效的算法。
增广路的定义(也称增广轨或交错轨):
若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。
由增广路的定义可以推出下述三个结论:
1-P的路径长度必定为奇数,第一条边和最后一条边都不属于M。
2-P经过取反操作可以得到一个更大的匹配M’。
3-M为G的最大匹配当且仅当不存在相对于M的增广路径。
用增广路求最大匹配(称作匈牙利算法,匈牙利数学家Edmonds于1965年提出)
算法轮廓:
(1)置M为空
(2)找出一条增广路径P,通过取反操作获得更大的匹配M’代替M
(3)重复(2)操作直到找不出增广路径为止
时间复杂度 邻接矩阵:最坏为O(n^3) 邻接表:O(nm)
空间复杂度 O(n^2) O(m+n)
程序清单:
#include<stdio.h>
#include<string.h>
bool g[201][201];
int n,m,ans;
bool b[201];
int link[201];
bool init()
{
int _x,
你可能喜欢
- 优秀数学建模论文
- 运筹学指派问题
- 遗传算法原理
- 美国数学建模论文
- 大学数学竞赛
- matlab动态规划
- 优秀数学建模论文117页
- 2012数学建模优秀论文A题21页
- 2012年数学建模美赛优秀论文21页
- 数学建模优秀论文20页
- 数学建模优秀论文PPT54页
- 论文心得-数学建模优秀论文心得体会3页
- 遗传算法原理与应用65页
- 第四章 遗传算法的基本原理与方法17页
- 遗传算法原理及其应用71页
- 遗传算法原理与应用课件103页
- 基于遗传算法的PID整定原理及matlab仿真程序5页
- 遗传算法的基本原理及其应用研究3页
- 数学建模美国赛论文常用句式总结【1】40页
- 美国中学生2010年数学建模竞赛论文3页
- 2012美国大学生数学建模竞赛A题一等奖论文29页
- 2013年美国数学建模A题论文 中文版9页
- 2013年美国数学建模A题论文 最佳布朗尼锅 The Ultimate Brownie Pan15页
- 美国数学建模论文格式2页


