WALKER

Dasturchi, frilanser, gik va introvert

by Sherzod Shermukhamedov

Maximum flow'ni topiş uçun Ford-Fulkerson algoritmi

image-from-rawpixel-id-434500-jpeg

Avvalgi maqolada maximum flow allaqaçon topilgan graph'ni körib ötdik. Endi flow'ni qanday hisoblaş haqida söz yuritamiz.

Mana öşa graph:

Maximum flow 28 ga teng.
Ammo qanday qilib 28 kelib çiqdi? Qanday qilib flow hisoblandi? Biz hisoblaşlarni qadamma-qadam körib ötamiz.

Ford-Fulkerson algoritmi

Tuşunarliroq bölişi uçun, graph'ni yönalişga ega quvurlar tarmoği deb olamiz.

Dastlabki holatida flow hisoblanmagan (quvurlar böş).

Max flow = 0 Max flow = 0

Har bir edge'ning (quvurning) ötkaziş qobilyati - capacity aniq berilgan. Biz bir vaqtning özida capacity'dan köp flow bera olmaymiz (capacity qiymatidan köp suv yubora olmaymiz).

Boşlanğiç nuqta - s dan maximum flow yuboriş uning edge capacity'lari yiğindisiga teng - 30. Biz quvurlar tizimining boşlanğiç nuqtasidan maksimum 30 şartli birlik (masalan, litr) suv yuborişimiz mumkin ekan: s -> 0 dan 10, s -> 1 dan 5, s -> 2 dan 15.

Lekin qolgan edge'lar capacity'si boşlanğiç nuqta - s nikidan past, demak biz maksimum 30 yubora olmaymiz. (Quvurlarni yorib yubormaslik uçun) avval s dan t gaça path'dagi edge capacity uçun çeklovlarni hisobga olişimiz kerak.

s dan t ga path'larni (quvurlarni) körib çiqamiz.

s -> 0 -> 3 -> t path'ning bir vaqtda maksimum ötkaziş qobilyati 9 ga teng, sababi 0 -> 3 capacity = 9. Uşbu path'ga max flow beramiz. (quvurlardan suv yuboramiz):

Max flow = 9 Max flow = 9

s -> 0 edge'ga yana 1 flow qöşişimiz (quvurdan yana 1 litr suv yuborişimiz mumkin). 1 qiymati 0 -> 4 -> t dan ketadi.

Max flow = 10 Max flow = 10

s -> 0 maksimum flow'ga erişdi. s dan keyingi edge'lar orqali t ga path qidiramiz.

s -> 1 -> 4 -> t path topildi. Uning maksimum ötkaziş qobilyati 5, sababi s -> 1 ning capacity'si 5 ga teng. Path edge'lariga 5 qöşib çiqamiz (quvurlardan 5 litr suv yuboramiz).

Max flow = 15 Max flow = 15

s -> 1 maksimum flow'ga erişdi. Bizda s -> 2 edge böş. s -> 2 orqali t ga path qidiramiz.

s -> 2 -> 5 -> t path topildi. Uning maksimum ötkaziş qobilyati 10 (quvurlardan 10 litr suv yuboramiz):

Max flow = 25 Max flow = 25

Biz quvurlarning ötkaziş qobilyatidan maksimum darajada foydalanyapmizmi? Hozirça yöq, s -> 2 edge yana 5 flow qöşişimiz mumkin. Bizda s dan t gaça yana böş path bormi? Ha, s -> 2 -> 5 -> 1 -> 4 -> t Uning maksimum ötkaziş qobilyati 3, sababi 1 -> 4 da 3 qöşişga böş joy bor.

Max flow = 28 Max flow = 28

Bizda yana böş path bormi? Yöq, barça path'lardagi kamida bitta edge capacity tölgan: s -> 0, 1 -> 4, 5 -> t. Biz s boşlanğiç nuqtadan t gaça ortiqça suv yubora olmaymiz.

Graph'ni tölgan capacity edge'lari böyiça ikkiga ajratsak, minimum cut'ni ham topgan bölamiz:

Biz maximum flow'ni topiş barobarida, maxflow = mincut teoremasini ham isbotladik.

Natijani sahifaning yuqorisidagi tayyor graph bilan taqqoslaganimizda t ga inflow farq qilyapti, {8, 10, 10} ga {9, 9, 10}. Bu qaysi (s t) path'lariga flow beriş tartibiga boğliq.

Şuningdek, biz reverse flow, flow'ni kamaytirişga ham duç kelmadik. Agar s -> 0 -> 4 -> t path'dan boşlaganimizda, keyinçalik biz 0 -> 4 ni 10/15 dan 2/15 ga kamaytirgan bölardik (erinmasangiz, özingiz şu yöl bilan hisoblab köring).

Davomi: Ford-Fulkerson algoritmini kodda ifodalaş