KM算法的几个例题

例题1:给出n个白点和n个黑点的坐标,要求用n条不相交得线段把他们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段

     分析:因为结点有黑色和白色,我们不难想到构造一个二分图,其中每个白点对应一个X结点,每个黑点对应Y结点,每个黑点与一个白点相连,权值等于二者的欧几里得距离。建模之后,权值最小的完美匹配是问题的解。为什么呢?假设在最佳完美匹配中有两条线段a1-b1与a2-b2相交,那么dis(a1,b1)+dis(a2,b2)一定大于dis(a1,b2)+dis(a2,b1),因此如果把这两条线段给成a1-b2和a2-b1后总长度会变小,与权值最小的完美匹配矛盾。


    例题2:早期的多程序操作系统常把所有的可用内存划分成一些大小固定的区域,不同的区域一般大小不同,而所有的区域的大小之和为可用内存的大小。给定一些程序,操作系统需要给每个程序分配一个区域,使得他们可以同时执行。可是每个程序的运行时间可能和它所占有的内存区域大小有关,因此调度并不容易。计算最优的内存分配策略,即给定m个区域的大小和n个程序在各种内存环境下的运行时间,找出一个调度方案,使得平均回转时间(平均结束时间)尽量小。具体来说,你需要给每个程序分配一个区域,使得没有两个程序在同一时间运行在同一个内存区域中,而所有程序分配的区域大小都不小于该程序的最低内存需求。程序对内存的需求不会超过最大内存块的大小。

    分析:先来看一个内存区域的情况。假设在这个内存区域按顺序执行的k个程序的运行时间分别为t1,t2,t3,...,tk,那么第i个程序的回转时间为ri=t1+t2+t3+....+ti。换句话说,如果程序i是内存区域j的倒数第p个执行的程序,则他对于总回转时间的贡献值为pT(i,j),其中T(i,j)为程序i在内存区域j中的运行时间。

    这样一来,算法就比较明显了。构造二分图G,X结点为n个程序,Y结点为n*m个位置,其中位置(i,j)表示第i个内存区域的倒数第j个执行程序。接下来就是求最小权匹配即可。注意,并不是每个匹配都对应一个合法的方案,比如,一个区域不能只有倒数第二个程序,而没有倒数第一个程序。但是最佳匹配一定对应一个合法方案。(反证法)

你可能感兴趣的:(二分匹配)