2014-03-30 45 views
11

我在讀http://www.geeksforgeeks.org/maximum-bipartite-matching/http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm,我很難理解。看來這個例子是假設每個工作只能接受1個人,每個人需要1個工作。我想知道如果例如v集的容量大於1(可以僱傭多個人來完成這項工作)並且u集大於1(每個人需要超過1個工作),算法/代碼將如何改變?最大二分配匹配(ford-fulkerson)

+2

您只需在圖形的左側和右側邊緣能力> 1,並像往常一樣查找最大流量。您的算法需要更通用一些,以跟蹤增強路徑的瓶頸容量。您可以閱讀有關福特 - 福克斯[在維基百科](http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm) –

+0

因此,讓我們說每個人都想要2個工作,每個工作有3個可用點。圖表看起來像這樣嗎? http://i.imgur.com/B0SvQjU.png – senjougahara

+0

中間的邊緣應該有容量1,除非你想多次指定一個人到同一個工作中(這可能是明智的,這取決於你的用例)。然後在該圖中找到最大流量並檢查它是否等於8(左側的容量總和)。如果沒有,那麼你不能滿足工作的每一個需求 –

回答

6

爲了讓作業分配有不止一個人,你只修改邊容量從JobsTerminal(以尼克拉斯B.在his comment如何描述相似,但不完全相同。)

篩選:

Flow network

的1來自SourcePeople,並從1到People保證Jobs的能力,一個人僅會爲一個J值選擇ob(因爲他們可以貢獻的最大流量是1)。然而,從JobsTerminal的容量> 1允許可以將多於一個人分配給該作業。

如果一個人還可以執行不止1個任務,從SourcePerson增加通過量,則最大流量:

Another flow network

ijkx是替身對於具有值的整數>= 1

這裏要記住的關鍵是流動能力在People的左邊指示他們可以有多少工作採取以及Jobs右側的流量表示可以爲該工作分配多少人。中間的能力不應該改變。