摘要: KM算法求完美匹配下的最大权匹配:在一个二分图中,左顶点集为A,右顶点集为B,现对于每组左右连接AiBj有权wij,求一种匹配使得所有wij的和最大。这里的完美匹配:在二分图中,X点集中的所有点都有对应的匹配或者是Y点集中所有的点都有对应的匹配。算法原理:1.若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。在算法执行过程中的任一时刻,对于任一条边(i,j),A[ i ]+B[j]>=w[i,j]始终成立。2.在求当前相等子图的完美匹配失败时,需要修改顶标值扩大相等子图,具体如下:失败的原因是因 阅读全文
posted @ 2012-07-19 18:48 pushing my way 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 这个题的题意是:在一个城镇中有路口和街道,这些街道是单向的并且不会形成环。每一个路口都会降落一名士兵,这些士兵会沿着街道的方向走。求走完所有路口所需要最少的士兵个数。归纳这个题可得为,有向无环图的最小路径覆盖数,可以通过匈牙利算法求得。在建图的过程中,跟无向图的建图类似,但是单向的。以下是代码:View Code 1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 using namespace std; 5 6 bool array[121][121]; 7 int res[ 阅读全文
posted @ 2012-07-19 15:49 pushing my way 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 路径覆盖定义:在有向无环图中,找出一些路径,使之覆盖图中的所有顶点,并且每个顶点的出度为1.结论:1.一个单独的顶点是一条路径。2.一个覆盖图中存在一条路径p1,p2,...pk,其中P1为起点,pk为终点,那么在该覆盖图中,顶点p1,p2...pk-1的出度为1,即不存在p1,p2...pk指向别的点的情况(覆盖图中)。3.最小路径覆盖就是找出最小的路径条数,使之成为该有向无环图的一个路径覆盖。有向无环图的最小路径覆盖可以通过匈牙利算法解决,注意必须是无环的情况下。公式:最小路径覆盖=定点数-最大匹配数。这里需要注意有向无环图的最小路径覆盖和无向图的最小路径覆盖的区别:有向无环图:求的是最小 阅读全文
posted @ 2012-07-19 15:38 pushing my way 阅读(1165) 评论(0) 推荐(0) 编辑
摘要: 这个题目的大意是:在一个矩阵中,*代表城市,要对这些城市覆盖无线网,每一个无线网可以覆盖最多两个城市,求将这些城市都覆盖上无线网时需要最小的无线网个数。因为无线网最多可以覆盖两个城市,也就是要找在两个城市中间的一条边,这让我想到了是最短路径覆盖问题,由于没有方向性的问题,所以确定为无向图的最短路径覆盖问题。编程过程中出现了一些问题:1.一开始在选择数据结构的时候考虑不足,开了一个二维数组存储城市的*和O,其实没有必要存储*和o,只需要在这个二维数组中记录城市的标号即可。2.在使用scanf()时出现bug,scanf(“%c”)会接受回车,所以应该在必要的地方用getchar()吸收回车,这个 阅读全文
posted @ 2012-07-19 11:26 pushing my way 阅读(895) 评论(0) 推荐(0) 编辑
摘要: 如图,在无向图G=(V,E)中:1.无向图的最小路径覆盖:即图中的极小边覆盖,注意极小边覆盖的定义不是G中的每个顶点有且仅有一条边与它关联!!!2.无向图的最小路径覆盖与二分图的匹配有公式:无向图最小路径覆盖数=顶点数-二分图最大匹配数/2。3.当求一个无向图的最小路径覆盖时,我们就要试图构造一个与这个无向图相一致的二分图:运用拆点的技术,将无向图中的每一个顶点i拆成两个点i和i′(复制),两个点分别属于不同的顶点集。无向图中的边相当于双向边,即将i到j的边拆分成i到j’的边和j到i’的边接下来就可以通过匈牙利算法求出最大匹配数了。 阅读全文
posted @ 2012-07-19 09:57 pushing my way 阅读(4172) 评论(4) 推荐(0) 编辑