二分圖是一個無向圖,它的n個頂點可二分為集合A和集合B,且同一集合中的任意兩個頂點在圖中無邊相連(即任何一條邊都是一個頂點在集合A中,另一個在集合B中)。若且唯若B中的每個頂點至少與A中一個頂點相連時,A的一個子集A' 覆蓋集合B(或簡單地說,A' 是一個覆蓋)。覆蓋A' 的大小即為A' 中的頂點數目。若且唯若A' 是覆蓋B的子集中最小的時,A' 為最小覆蓋。
例1-10 考察如圖1 - 6所示的具有1 7個頂點的二分圖,A={1, 2, 3, 16, 17}和B={4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15},子集A'={ 1 , 1 6 , 1 7 }是B的最小覆蓋。在二分圖中尋找最小覆蓋的問題為二分覆蓋( b i p a r t i t e - c o v e r)問題。在例1 2 - 3中說明了最小覆蓋是很有用的,因為它能解決“在會議中使用最少的翻譯人員進行翻譯”這一類的問題。
二分覆蓋問題類似於集合覆蓋( s e t - c o v e r)問題。在集合覆蓋問題中給出了k個集合S={S1 , S2 ,., Sk },每個集合Si 中的元素均是全集U中的成員。若且唯若èi S'Si=U時,S的子集S' 覆蓋U,S '中的集合數目即為覆蓋的大小。若且唯若沒有能覆蓋U的更小的集合時,稱S' 為最小覆蓋。可以將集合覆蓋問題轉化為二分覆蓋問題(反之亦然),即用A的頂點來表示S1 , ., Sk ,B中的頂點代表U中的元素。若且唯若S的相應集合中包含U中的對應元素時,在A與B的頂點之間存在一條邊。
例1 - 11 令S={S1,...,S5 }, U={ 4,5,...,15}, S1={ 4,6,7,8,9,1 3 },S2={ 4,5,6,8 },S3={ 8,1 0,1 2,1 4,1 5 },S4={ 5,6,8,1 2,1 4,1 5 },S5={ 4,9,1 0,11 }。S '={S1,S4,S5 }是一個大小為3的覆蓋,沒有更小的覆蓋,S' 即為最小覆蓋。這個集合覆蓋問題可映射為圖1-6的二分圖,即用頂點1,2,3,1 6和1 7分別表示集合S1,S2,S3,S4 和S5,頂點j 表示集合中的元素j,4≤j≤1 5。
集合覆蓋問題為N P-複雜問題。由於集合覆蓋與二分覆蓋是同一類問題,二分覆蓋問題也是N P-複雜問題。因此可能無法找到一個快速的演算法來解決它,但是可以利用貪婪演算法尋找一種快速啟發學習法方法。一種可能是分步建立覆蓋A' ,每一步選擇A中的一個頂點加入覆蓋。頂點的選擇利用貪婪準則:從A中選取能覆蓋B中還未被覆蓋的元素數目最多的頂點。
例1-12 考察圖1 - 6所示的二分圖,初始化A'=且B中沒有頂點被覆蓋,頂點1和1 6均能覆蓋B中的六個頂點,頂點3覆蓋五個,頂點2和1 7分別覆蓋四個。因此,在第一步往A' 中加入頂點1或1 6,若加入頂點1 6,則它覆蓋的頂點為{ 5 , 6 , 8 , 1 2 , 1 4 , 1 5 },未覆蓋的頂點為{ 4 , 7 , 9 , 1 0 , 11 , 1 3 }。頂點1能覆蓋其中四個頂點( { 4 , 7 , 9 , 1 3 }),頂點2 覆蓋一個( { 4 } ),頂點3覆蓋一個({ 1 0 }),頂點1 6覆蓋零個,頂點1 7覆蓋四個{ 4 , 9 , 1 0 , 11 }。下一步可選擇1或1 7加入A' 。若選擇頂點1,則頂點{ 1 0 , 11} 仍然未被覆蓋,此時頂點1,2,1 6不覆蓋其中任意一個,頂點3覆蓋一個,頂點1 7覆蓋兩個,因此選擇頂點1 7,至此所有頂點已被覆蓋,得A'={ 1 6 , 1 , 1 7 }。
圖1 - 7給出了貪婪覆蓋啟發學習法方法的虛擬碼,可以證明: 1) 若且唯若初始的二分圖沒有覆蓋時,演算法找不到覆蓋;2) 啟發學習法方法可能找不到二分圖的最小覆蓋。
1.資料結構的選取及複雜性分析
為實現圖13 - 7的演算法,需要選擇A' 的描述方法及考慮如何記錄A中節點所能覆蓋的B中未覆蓋節點的數目。由於對集合A' 僅使用加法運算,則可用一維整型數組C來描述A ',用m 來記錄A' 中元素個數。將A' 中的成員記錄在C[ 0 :m-1] 中。對於A中頂點i,令N e wi 為i 所能覆蓋的B中未覆蓋的頂點數目。逐步選擇N e wi 值最大的頂點。由於一些原來未被覆蓋的頂點現在被覆蓋了,因此還要修改各N e wi 值。在這種更新中,檢查B中最近一次被V覆蓋的頂點,令j 為這樣的一個頂點,則A中所有覆蓋j 的頂點的N e wi 值均減1。