πŸ‘©β€πŸ’» ν”„λ‘œκ·Έλž˜λ°/🎐 μ•Œκ³ λ¦¬μ¦˜

ν¬λ“œ-ν’€μ»€μŠ¨ μ•Œκ³ λ¦¬μ¦˜(μ΅œλŒ€ μœ λŸ‰ 문제)

peewoong 2024. 4. 19. 13:09

🌟 μ΅œλŒ€ μœ λŸ‰ 문제(=λ„€νŠΈμ›Œν¬ ν”Œλ‘œμš°)

νŠΉμ •ν•œ μ§€μ μ—μ„œ λ‹€λ₯Έ μ§€μ μœΌλ‘œ, μ–Όλ§ˆλ‚˜ λ§Žμ€ μœ λŸ‰μ„ λ™μ‹œμ— 보낼 수 μžˆλŠ”μ§€ κ³„μ‚°ν•˜λŠ” 문제

 

✏️ μš©μ–΄ 정리

μš©λŸ‰ : c(u,v)

정점 uμ—μ„œ v둜 전솑할 수 μžˆλŠ” μ΅œλŒ€ μš©λŸ‰

 

μœ λŸ‰ : f(u,v)

정점 uμ—μ„œ v둜 μ‹€μ œ 흐λ₯΄κ³  μžˆλŠ” μœ λŸ‰

 

μž”μ—¬ μš©λŸ‰ : r(u,v) = c(u,v) - f(u,v)

κ°„μ„ μ˜ μš©λŸ‰κ³Ό μ‹€μ œλ‘œ 흐λ₯΄λŠ” μœ λŸ‰μ˜ 차이

 

μ†ŒμŠ€ s

λͺ¨λ“  μœ λŸ‰μ΄ μ‹œμž‘λ˜λŠ” 정점

 

싱크 t

λͺ¨λ“  μœ λŸ‰μ΄ λ„μ°©ν•˜λŠ” 정점

 

증가 경둜

μ†ŒμŠ€μ—μ„œ μ‹±ν¬λ‘œ μœ λŸ‰μ„ 보낼 수 μžˆλŠ” 경둜

 

✏️ κΈ°λ³Έ 속성

μš©λŸ‰ μ œν•œ 속성 f(u,v) <= c(u,v)

μœ λŸ‰μ€ μš©λŸ‰λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™λ‹€.

 

μœ λŸ‰μ˜ λŒ€μΉ­μ„± f(u,v) = -f(v,u)

uμ—μ„œ v둜 μœ λŸ‰μ΄ 흐λ₯΄λ©΄, vμ—μ„œ u둜 음수의 μœ λŸ‰μ΄ 흐λ₯΄λŠ” 것과 λ™μΌν•˜λ‹€.

 

μœ λŸ‰μ˜ 보쑴성

각 정점에 λ“€μ–΄μ˜€λŠ” μœ λŸ‰κ³Ό λ‚˜κ°€λŠ” μœ λŸ‰μ€ κ°™λ‹€.

 

🌟 κΈ°μ‘΄ μ΅œλŒ€ μœ λŸ‰ 탐색 λ°©λ²•μ˜ 문제점

ν”„λ‘œκ·Έλž¨μ€ Sμ—μ„œ T둜 κ°€λŠ” λͺ¨λ“  경둜λ₯Ό νƒμƒ‰ν•˜λ©°, μ΅œλŒ€ μœ λŸ‰μ„ 계산할 것이닀.

S πŸ‘‰ a πŸ‘‰ T

S πŸ‘‰ a πŸ‘‰ b πŸ‘‰ T

S πŸ‘‰ b πŸ‘‰ T

 

λ§Œμ•½, ν”„λ‘œκ·Έλž¨μ΄ μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 Sβ†’a β†’T와 S β†’b β†’T의 경둜λ₯Ό λ¨Όμ € νƒμƒ‰ν•˜κ²Œ λœλ‹€λ©΄

ν•΄λ‹Ή λ„€νŠΈμ›Œν¬μ˜ μ΅œλŒ€ μœ λŸ‰μ€ 2κ°€ λ˜λ©΄μ„œ ν”„λ‘œκ·Έλž¨μ€ 정닡을 λ§žμΆ”κ²Œ λœλ‹€.

 

ν•˜μ§€λ§Œ, λ§Œμ•½ ν”„λ‘œκ·Έλž¨μ΄ μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 Sβ†’a β†’b β†’T의 경둜λ₯Ό κ°€μž₯ λ¨Όμ € νƒμƒ‰ν•˜κ²Œ 되면

S β†’ a, a β†’ b, b β†’T κ°„μ„ μ˜ μœ λŸ‰μ΄ μ΅œλŒ€μΉ˜μ΄κΈ° λ•Œλ¬Έμ—

S β†’ b 에 μΆ”κ°€λ‘œ μ—°κ²°λœ 경둜λ₯Ό μ°Ύμ§€ λͺ»ν•˜κ²Œ 되고

μ΅œλŒ€ μœ λŸ‰μ΄ 1인  μƒνƒœμ—μ„œ ν”„λ‘œκ·Έλž¨μ€ μ€‘μ§€λ˜κ²Œ λœλ‹€.

 

πŸ‘‰ μœ λŸ‰ 상쇄λ₯Ό 톡해 문제 ν•΄κ²°  κ°€λŠ₯

 

🌟 μœ λŸ‰ 상쇄

λͺ¨λ“  κ²½λ‘œμ—, 기쑴에 μ‘΄μž¬ν•˜λŠ” κ°„μ„ λ“€κ³Ό λ°˜λŒ€λ˜λŠ” λ°©ν–₯의 간선을 μΆ”κ°€ν•œ λ’€

각 κ°„μ„ μœΌλ‘œ μœ λŸ‰μ„ ν˜λ €λ³΄λƒˆμ„ λ•Œ, λ°˜λŒ€ λ°©ν–₯의 κ°„μ„ μœΌλ‘œλ„ 음의 μœ λŸ‰μ„ ν˜λ €λ³΄λƒ„μœΌλ‘œμ¨, μœ λŸ‰μ„ μƒμ‡„μ‹œν‚€λŠ” 것

λ¬Όλ‘ , μ‹€μ œλ‘œλŠ” λΆˆκ°€λŠ₯ν•œ μ΄μ•ΌκΈ°μ΄μ§€λ§Œ, 음의 μœ λŸ‰μ„ κΈ°λ‘ν•¨μœΌλ‘œμ¨ μž”μ—¬ μš©λŸ‰μ„ 남겨, 좔가적인 경둜λ₯Ό 탐색할 수 μžˆλ„λ‘  ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

 

EX

a β†’ b의 간선이 μ‘΄μž¬ν•˜λ©°, μœ λŸ‰ f(a,b)은 1, μš©λŸ‰ c(a,b)은 1이라면

μ—­κ°„μ„  b β†’ a의 μœ λŸ‰ f(b,a)은 κΈ°μ‘΄ κ°„μ„ μ˜ λ°©ν–₯κ³Ό λ°˜λŒ€μ΄λ―€λ‘œ -1이 되며

μš©λŸ‰ c(b,a)은 μ‹€μ œ μ‘΄μž¬ν•˜λŠ” 간선이 μ•„λ‹ˆλ―€λ‘œ 0이 λœλ‹€.

λ”°λΌμ„œ, μ—­κ°„μ„  b β†’ a의 μž”μ—¬ μš©λŸ‰ r(b,a)은 c(b,a) - f(b,a) = 0 - (-1) = 1이 λœλ‹€.

즉, μ—­κ°„μ„  b β†’ a둜 1의 μœ λŸ‰μ„ μΆ”κ°€μ μœΌλ‘œ ν˜λ €λ³΄λ‚Ό 수 있게 λœλ‹€.

 

πŸ‘‰ ν•΄λ‹Ή κ·œμΉ™μ€ 두 정점이 μ„œλ‘œμ—κ²Œ μœ λŸ‰μ„ λ³΄λ‚΄μ£ΌλŠ” 것이 μ˜λ―Έκ°€ μ—†κΈ° λ•Œλ¬Έμ— 성립할 수 있으며, μ†ŒμŠ€μ—μ„œ μ‹±ν¬λ‘œ κ°€λŠ” 총 μœ λŸ‰λ„ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

🟩 ν¬λ“œ-ν’€μ»€μŠ¨ μ•Œκ³ λ¦¬μ¦˜

1. λ„€νŠΈμ›Œν¬μ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  κ°„μ„ μ˜ μœ λŸ‰μ„ 0으둜 μ΄ˆκΈ°ν™”ν•˜κ³ , μ—­λ°©ν–₯ κ°„μ„ μ˜ μœ λŸ‰λ„ 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

2. μ†ŒμŠ€μ—μ„œ μ‹±ν¬λ‘œ 갈 수 μžˆλŠ”, μž”μ—¬ μš©λŸ‰μ΄ 남은 경둜λ₯Ό DFS둜 νƒμƒ‰ν•œλ‹€.

3. ν•΄λ‹Ή κ²½λ‘œμ— μ‘΄μž¬ν•˜λŠ” κ°„μ„ λ“€μ˜ μž”μ—¬ μš©λŸ‰ 쀑, κ°€μž₯ μž‘μ€ 값을 μœ λŸ‰μœΌλ‘œ ν˜λ €λ³΄λ‚Έλ‹€.

4. ν•΄λ‹Ή μœ λŸ‰μ— μŒμˆ˜κ°’μ„ μ·¨ν•΄, μ—­λ°©ν–₯ 간선에도 ν˜λ €λ³΄λ‚Έλ‹€ (μœ λŸ‰ 상쇄)

5. 더 이상 μž”μ—¬ μš©λŸ‰μ΄ 남은 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

 

🟩 예제

 

μœ„ 그림은, λ„€νŠΈμ›Œν¬μ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  κ°„μ„ μ˜ μœ λŸ‰μ„ 0으둜 μ΄ˆκΈ°ν™”μ‹œν‚€κ³ , μ—­λ°©ν–₯ κ°„μ„ μ˜ μœ λŸ‰λ„ 0으둜 μ΄ˆκΈ°ν™”ν•œ λ’€

DFSλ₯Ό 톡해, μ†ŒμŠ€μ—μ„œ μ‹±ν¬λ‘œ 갈 수 μžˆλŠ” 경둜 쀑 ν•˜λ‚˜μΈ S β†’ a β†’ b β†’ T 경둜λ₯Ό νƒμƒ‰ν•˜κ³ 

ν•΄λ‹Ή κ²½λ‘œμ— μ‘΄μž¬ν•˜λŠ” κ°„μ„ λ“€μ˜ μž”μ—¬ μš©λŸ‰ 쀑, κ°€μž₯ μž‘μ€ 값인 1을 μœ λŸ‰μœΌλ‘œ ν˜λ €λ³΄λ‚Έ λ’€

ν•΄λ‹Ή μœ λŸ‰μ— μŒμˆ˜κ°’μ„ μ·¨ν•΄, μ—­λ°©ν–₯ 간선에도 -1을 ν˜λ €λ³΄λ‚Έ 결과이닀.

즉, bμ—μ„œ a둜 1만큼의 μœ λŸ‰μ„ μΆ”κ°€λ‘œ ν˜λ €λ³΄λ‚Ό 수 μžˆλŠ” 것을 μ•Œ 수 μžˆλ‹€.

결과적으둜, κ°„μ„  (a,b)와 (b,a)κ°€ μƒμ‡„λ˜λ―€λ‘œ, μ•„λž˜μ™€ 같은 정닡이 λ„μΆœλœλ‹€.

🟩 νŠΉμ§•

DFS λ°©μ‹μœΌλ‘œ 증가 경둜λ₯Ό μ°ΎλŠ”λ‹€.

λΉ„νš¨μœ¨μ μœΌλ‘œ λ™μž‘ κ°€λŠ₯ cf. 문제의 μ΅œλŒ€ μœ λŸ‰μ΄ 적고, 간선이 많으면 였히렀 DFSκ°€ 효율적일 수 μžˆλ‹€.

μ‹œκ°„λ³΅μž‘λ„ O((E+V) * F)