Network Flow

Network Flow#

κ·Έλž˜ν”„ 두 λ…Έλ“œ 사이에 μ–Όλ§ˆλ‚˜ λ§Žμ€ μœ λŸ‰μ„ 보낼 수 μžˆλŠ”μ§€ κ³„μ‚°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ network flow, maximum flow 라고 λΆˆλ¦°λ‹€

μΆœλ°œμ μ—μ„œ λͺ©μ μ§€κΉŒμ§€ 물을 ν˜λ €λ³΄λ‚Όλ•Œ, κ°€μž₯ λ§Žμ€ μ–‘μ˜ 물을 ν˜λ €λ³΄λ‚΄λŠ” 방법 μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. μ΅œμ†Œ 경둜 λ¬Έμ œλŠ” κ·Έλ™μ•ˆ 많이 μ ‘ν•  수 μžˆμ–΄μ„œ μ΅μˆ™ν•  수 μžˆμ§€λ§Œ, 여기에 μš©λŸ‰μ΄λΌλŠ” κ°œλ…μ΄ μΆ”κ°€λœλ‹€. \(\text{capacity >= flow}\)둜 μ΅œλŒ€ μš©λŸ‰ 만큼 ν˜λ €λ³΄λ‚Ό 수 μžˆλ‹€. λ‹€λ₯Έ 것듀은 λΉ„μŠ·ν•˜λ‹€. λ‹€λ₯΄κ²Œ ν‘œν˜„ν•˜λ©΄ \(c(u,v) >= f(u,v)\)이닀.

wordpool

Node : 정점 ν•˜λ‚˜μ˜ 지점

Capacity : μš©λŸ‰ c λ…Έλ“œ uμ—μ„œ v둜 κ°€λŠ” κ°„μ„ μ˜ μš©λŸ‰(κ°€μ€‘μΉ˜) \(c(u,v)\)

Flow : μœ λŸ‰ f 정점 uμ—μ„œ v둜의 간선에 μ‹€μ œλ‘œ 흐λ₯΄λŠ” μœ λŸ‰ \(f(u,v)\)

Residual capacity : μž”μ—¬ μš©λŸ‰ r κ°„μ„ μ˜ μš©λŸ‰κ³Ό μœ λŸ‰μ˜ 차이, 간선에 μΆ”κ°€μ μœΌλ‘œ 흘렀 보낼 수 μžˆλŠ” μœ λŸ‰ \(r(u,v) = c(u,v) - f(u,v)\)

Source \(s\), Sink \(t\) μœ λŸ‰μ΄ μ‹œμž‘λ˜λŠ” 지점, μœ λŸ‰μ΄ λ„μ°©ν•˜λŠ” 지점 μœ λŸ‰μ€ μ†ŒμŠ€μ—μ„œλΆ€ν„° μ‹±ν¬λ‘œ 흐λ₯΄κ²Œ λ˜λŠ” ꡬ쑰

Ford-Fulkerson#

μ΅œμ†Œμ»·

(1)#\[ \tag{μœ λŸ‰μ˜ λŒ€μΉ­μ„±} f(u,v) = -f(v,u) \]

κ°„μ„  (u,v) λ°©ν–₯으둜 flowκ°€ μ‘΄μž¬ν•œλ‹€λ©΄(f(u,v)>0), μ—­λ°©ν–₯μœΌλ‘œλŠ” 음의 μœ λŸ‰μ΄ 그만큼 흐λ₯΄κ³  μžˆλŠ” κ²ƒμœΌλ‘œ μ·¨κΈ‰ν•œλ‹€λŠ” 의미λ₯Ό μœ λŸ‰μ˜ λŒ€μΉ­μ„±μ΄λΌκ³  λ§ν•œλ‹€. κ°„μ„  (u,v)κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ c(u,v)κ°€ μ–‘μˆ˜κ³ , c(v,u)λŠ” 0으둜 μ·¨κΈ‰λœλ‹€. λ”°λΌμ„œ κ·Έλž˜ν”„μ—μ„œλŠ” μ—†λŠ” κ°„μ„ μ΄μ§€λ§Œ κ°€μƒμœΌλ‘œλŠ” μžˆλŠ” μ—­λ°©ν–₯ 간선에 λŒ€ν•œ μ„±μ§ˆλ‘œ μ ‘κ·Όν•˜λŠ” 것이 ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ˜ ν¬μΈνŠΈλ‹€. μ—­λ°©ν–₯ κ°„μ„ μœΌλ‘œ ν˜λ €λ³΄λ‚Έλ‹€λŠ” μ˜λ―ΈλŠ” 곧 λ‹€λ₯Έ κ°„μ„ μœΌλ‘œ λŒ€μ‹  ν˜λ €λ³΄λ‚Έλ‹€λŠ” μ˜λ―Έμ™€ λ™λ“±ν•˜λ‹€.

ν΄νŠΈν¬μ»€μŠ¨μ—μ„œ μ€‘μš”ν•œ 것은 μœ„μ˜ μœ λŸ‰μ˜_λŒ€μΉ­μ„±μ„ μ‚¬μš©ν•œλ‹€λŠ” 것이닀. μ›λž˜λŠ” μ—†λŠ” 간선일지라도 ν•΄λ‹Ή μ„±μ§ˆμ„ μ΄μš©ν•˜λ©΄ μˆ¨μ–΄μžˆλŠ” κ°„μ„ μ˜ μž”μ—¬μœ λŸ‰μ„ 찾을 수 μžˆλ‹€.

  1. s \(\to\) t둜 κ°€λŠ” 경둜 μ•„λ¬΄κ±°λ‚˜ ν•˜λ‚˜ μ°ΎλŠ”λ‹€. μ΄λ•Œ κ²½λ‘œλŠ” λ‹¨μˆœ 경둜이고, κ²½λ‘œμƒμ˜ λͺ¨λ“  간선에 아직 μ—¬μœ  μš©λŸ‰μ΄ λ‚¨μ•„μžˆλ‹€. 즉 \(c(u,v)-f(u,v) > 0\)

  2. 차단 간선을 μ°ΎλŠ”λ‹€. 이 간선은 κ²½λ‘œμƒμ—μ„œ \(c(u,v)-f(u,v)\)의 값이 μ΅œμ†ŒμΈ 간선이닀. λ§Žμ•„λ΄μ•Ό 이만큼의 μœ λŸ‰μ„ 더 보낼 수 μžˆλ‹€. μ΄λŠ” μž”μ—¬μš©λŸ‰ \(r\) 이닀. μž”μ—¬μš©λŸ‰μ΄ 0이면 더이상 ν•΄λ‹Ή κ°„μ„ μ—λŠ” μœ λŸ‰μ„ 보낼 수 μ—†λ‹€.

  3. κ²½λ‘œμƒ λͺ¨λ“  간선에 \(r\)만큼의 μœ λŸ‰μ„ μΆ”κ°€ν•œλ‹€. λ”°λΌμ„œ κ²½λ‘œμƒ λͺ¨λ“  간선에 λŒ€ν•΄μ„œ \(f(u,v)+=r\)이 되고, μœ„μ˜ λŒ€μΉ­μ„±μ„ μ΄μš©ν•΄μ„œ \(f(v,u)-=F\)도 ν•΄μ€˜μ•Όν•œλ‹€.

μœ„μ˜ 3 단계λ₯Ό 더이상 증가 κ²½λ‘œκ°€ 없을 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•œλ‹€. 증가 경둜λ₯Ό μ°Ύκ³ , 찾은 κ²½λ‘œμ— λŒ€ν•΄ κ°€λŠ₯ν•œ ν•œ λ§Žμ€ μœ λŸ‰μ„ ν˜λ €λ³΄λ‚΄λŠ” κ²ƒμ˜ λ°˜λ³΅μ΄λ‹€.

보톡 BFS λ„ˆλΉ„μš°μ„ νƒμƒ‰μœΌλ‘œ 많이 ν‘Όλ‹€.

minimum cut#

κ·Έλž˜ν”„μ—μ„œ 두 개의 정점 집합을 κ΅¬λΆ„ν•˜λŠ” κ°€μž₯ 짧은 경둜λ₯Ό μ°ΎλŠ” 문제

기본적으둜 Cutμ΄λΌλŠ” 것은 κ·Έλž˜ν”„μ˜ 정점을 2개의 μ„œλ‘œ λ‹€λ₯Έ μ§‘ν•©μœΌλ‘œ λ‚˜λˆ„λŠ” 것을 λ§ν•œλ‹€. μ—¬κΈ°μ„œ κ°€μ€‘μΉ˜(λΉ„μš©)이 μ—†λŠ” κ·Έλž˜ν”„μ˜ κ²½μš°λŠ” 자λ₯Έ κ°„μ„ μ˜ κ°œμˆ˜κ°€ cut의 λΉ„μš©μ΄κ³ , μžˆλŠ” κ·Έλž˜ν”„λŠ” 자λ₯Έ κ°„μ„ μ˜ κ°€μ€‘μΉ˜μ˜ 합이 cut의 λΉ„μš©μ΄λ‹€.

그렇기에 min cut λ¬Έμ œλŠ” 집합을 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ 그은 κ°„μ„ μ˜ κ°€μ€‘μΉ˜ 합이 κ°€μž₯ μ κ²Œν•˜κΈ° 문제라고 λ³Ό 수 μžˆλ‹€. μ΅œμ†Œ μ»· λ¬Έμ œλŠ” ν”Œλ‘œμš°μ™€ 관련이 맀우 λ§Žλ‹€. 정점 두 개λ₯Ό λΆ„λ¦¬μ‹œν‚€λŠ” μ΅œμ†Œ 컷의 λΉ„μš©μ€ 각 κ°„μ„ μ˜ λΉ„μš©μ„ μš©λŸ‰μ΄λΌ ν• λ•Œ μ΅œλŒ€ μœ λŸ‰κ³Ό λ™μΉ˜μ΄λ‹€.

λ‹€μ‹œ ν•œ 번 μ •λ¦¬ν•˜μžλ©΄, μ΅œλŒ€ μœ λŸ‰μœΌλ‘œ ν˜λ €λ³΄λ‚΄λŠ” μƒν™©μ—μ„œλŠ” μ–΄λ–€ 컷을 μ„ νƒν•˜λ”λΌλ„ 컷에 ν¬ν•¨λœ κ°„μ„ λ“€μ—μ„œ 흐λ₯΄λŠ” 물의 양은 λ™μΌν•˜λ‹€λŠ” 것이닀.

referance#