е перестали відзначатися.
Ч0a2«a3»a4«Чb1»b2«b3»00c2«c3»c4«Чd1»00d4'
Тепер проводимо лінії через всі відмічені стовпці і невідмічені рядка.
Ч0a2«a3»a4«Чb1»b2«b3»00c2«c3»c4«Чd1»00d4'
Всі ці дії переслідували лише одну мету: провести найменшу кількість ліній (вертикалей і горизонталей), щоб покрити всі червоні нулі. Можна було скористатися будь-яким іншим методом замість описаного.
Крок 4
З непокритих лініями елементів матриці (в даному випадку це a2 «, a3», a4 «, c2», c3 «, c4») знайти найменший. Відняти його з усіх не зазначених рядків і додати до всіх перетинів зазначених рядків і стовпців. Так, наприклад, якщо найменший елемент з перерахованих дорівнює а2 ', ми отримаємо
Ч00a3«-а2»a4«-a2»Чb1«+a2»b2«b3»00c2«-а2»c3«-а2»c4«-а2»Чd1«+a2»00d4'
Повторювати процедуру (кроки 1-4) до тих пір, поки призначення не стане можливим.
Реалізація на python.
У лістингу 3 наводиться приклад реалізації рішення прикладу, описаного вище, на мові програмування python.
Лістинг 3.
improveLabels (val):
«» »change the labels, and maintain minSlack.
«» »u in S: [u] -=valv in V: v in T: [v] +=val: [v] [0] -=val
improveMatching (v):
«» »apply the alternating path from v to the root in the tree.
«» »= T [v] u in Mu: (Mu [u]) [u]=v [v]=u
slack (u, v): return lu [u] + lv [v] - w [u] [v]
augment ():
«» »augment the matching, possibly improving the lablels on the way.
«» »True:
# select edge (u, v) with u in S, v not in T and min slack
((val, u), v)=min ([(minSlack [v], v) for v in V if v not in T]) u in Sval> 0: (val)
# now we are sure that (u, v) is saturatedslack (u, v) == 0 [v]=u # add (u, v) to the treev in Mv:=Mv [ v] # matched edge, not u1 in S [u1]=True # ... add endpoint to treev in V: # maintain minSlacknot v in T and minSlack [v] [0]> slack (u1, v): [v]=[slack (u1, v), u1]: (v) # v is a free vertex
maxWeightMatching (weights):
«» »given w, the weight matrix of a complete bipartite graph, the mappings Mu: U-> V, Mv: V-> U encoding the matchingwell as the value of it.
«» »U, V, S, T, Mu, Mv, lu, lv, minSlack, w=weights=len (w)=V=range (n)=[max ([w [u] [v] for v in V]) for u in U] # start with trivial labels=[0 for v in V]={} # start with empty matching={} len (Mu)
# val. of matching is total edge weight=sum (lu) + sum (lv)...