【图论】二分图
二分图(又称作二部图)
设G=(V,{R})是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。
其实还有一个概念:
不存在奇数条边的简单回路。
最大匹配
给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
选择这样的边数最大的子集称为图的最大匹配问题(maximal matching problem)
如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。
增广路(也称增广轨或交错轨)
若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。
交替路
从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边...形成的路径叫交替路。
【匈牙利算法】——求最大匹配
推荐一个趣味解释匈牙利算法的链接:http://blog.csdn.net/dark_scope/article/details/8880547/
由增广路的定义可以推出下述三个结论:
1-P的路径长度必定为奇数,第一条边和最后一条边都不属于M。
2-P经过取反操作可以得到一个更大的匹配M’。
3-M为G的最大匹配当且仅当不存在相对于M的增广路径。
1 bool find(int x) 2 { 3 int i,j; 4 for (j=1;j<=m;j++){ 5 if (map[x][j]==true && visit[j]==false) 6 7 { 8 visit[j]=1; 9 if (match[j]==0 || find(match[j])) 10 { 11 match[j]=x; 12 return true; 13 } 14 } 15 } 16 return false; 17 }
最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联;
最小边覆盖:用尽量少的不相交简单路径覆盖有向无环图(DAG)G的所有顶点;
最大独立集:在N个点的图G中选出m个点,使这m个点两两之间没有边的点中,m的最大值。
证明参考:http://blog.csdn.net/huangshuai147/article/details/51087275
完。
2017-07-13 Hathaway