茞éã®åé¡ïŒå€å
žçïŒã¯ãå庫ããè»äž¡ã®æ¶è²»å°ç¹ã«ååã茞éããããã®æé©ãªèšç»ã®åé¡ã§ãã
å€å
žçãªèŒžéã®åé¡ã§ã¯ã2ã€ã®ã¿ã€ãã®ã¿ã¹ã¯ãåºå¥ãããŸããã³ã¹ãã®åºæºïŒèŒžéã®æå°ã³ã¹ããéæããïŒãŸãã¯è·é¢ãšæéã®åºæºïŒèŒžéã«è²»ããããæå°æéïŒã§ãã
ã«ããã®äžã«ã¯å€ãã®ããã¹ãããããŸãã ãã®åé¡ããåçã§ã解決ããããã®ãªãã·ã§ã³ã®1ã€ã¯ã
ã°ã©ãã«ããŸãæ
£ããŠããªã人åãã§ãã æ·»ä»ãªã¹ãã
質åãåºãããHabréãšãåºæ¬çãªã¢ã«ãŽãªãºã ã«é¢ããèšäºãå¿
èŠãã©ããã«ã€ããŠãèšäºãäœããã®åœ¢ã§ã¹ãªããããŸããã ãªã¯ãšã¹ãã«å¿çããã°ã©ãäžã®ã¢ã«ãŽãªãºã ãšãã®å®çšåã«ã€ããŠå°ã話ãããšã«ããŸããã ã©ã®ã¬ãã«ã®ç¥èã«äŸåãã¹ããããããªãã£ãã®ã§ãæ¯èŒçè€éã§çè«çã«å®çšçãªã¢ã«ãŽãªãºã ãéžæããŠãèšäºãå°ãªããšãéšåçã«èªç¶ã«é©çšãããããã«ããŸããã åæã«ãã°ã©ãã«ç¹ã«ç²ŸéããŠããªã人ã«ããéåžžã«å€ãã®ããšãäŒããããšããŸãã
åé¡ïŒããšã話ïŒïŒããªãã¯ãã°ããºããçç£ããŠããç¹å®ã®å·¥å Žã®ææè
ã§ãããæè¿ãå¥ã®éœåžã«ãã1ã€ã®å€§äŒæ¥ãšå°å£²ãããã¯ãŒã¯ãžã®ååã®äŸçµŠå¥çŽãçµã¶ããšãã§ããŸããã ïŒãŠã©ãžãªã¹ãã¯ã§ã¯ïŒéåžžã«é ãã®ã§ãååã¯é£è¡æ©ã§é
éããå¿
èŠããããŸãã é»è©±ã§ã®äŒè©±äžã«ãããŒãããŒ
ã¯æ¬¡ã®ããã«è³ªåããŸããã ãã ããªãã¯èããŠããŸãã...ããªãã¯èªåã®ãã©ãã¯ïŒãã©ãã¯ïŒã茞éããŠããŸãã 空枯ã¯é ãã§ãã 茞éã®èç©ãããçµ±èšã確èªããåŸã茞éäžã«èªåã®ãšãªã¢ã«ããã€ãã®å¶éãããããšãããããŸãããéè·¯ã«ã¯è²šç©æ€æ»ãéé管çã®ãã€ã³ãããããäžéšã®éè·¯ã¯å®å
šã«ä¿®åŸ©ãããŠããŸãã ããããã¹ãŠ1æ¥ãããã®éè·¯ã®ã
ã¹ã«ãŒããã ããšåŒã³ãŸãã ãããã®æ¡ä»¶ã«åºã¥ããŠã1æ¥ãããäœç®±ã®ãã°ããºãã空枯ã«èŒžéã§ãããã調ã¹ãå¿
èŠããããŸãã åæã«ã广çã«ããžãã¹ãè¡ããæçã«ãŒãã§ååãé
éãããã®ã¯ã ã¿ã€ã€ã®æ©èãã¡ã«ããºã ãããã³äžè¬çãªæžäŸ¡ååŽè²»ã§ãã
åèšïŒã«ãŒãã®åèšè·é¢ãæå°éã«æããªãããéè·¯ã®å®¹éãèæ
®ããŠã1æ¥ã«ç©ºæž¯ãŸã§ããã€ã®ç®±ã茞éã§ããŸããïŒ
ã¿ã¹ã¯ã¯ã°ã©ãäžã§æãå€ããªããŸãã ãœãªã¥ãŒã·ã§ã³ã¯åŸã
ã«æ§ç¯ãããŸãã
倧ããªåé¡ã¯ãããŸãããå°ããªåé¡ããããããããŸãã ïŒcïŒ
ç§ãããèšããããããªãå Žåãã¢ã«ãŽãªãºã ã¯ãèšã ãããã«ã¯ããããã®èª¬æããããŸãã
åºæ¬çãªæŠå¿µã ã«ãŠã³ãïŒ ç·çµïŒ
ãã®å Žåã®ããŒããããã¯ãã°ã©ãã®åœ¢åŒã§è¡šç€ºãããŸãã é ç¹ã¯äº€å·®ç¹ã§ãããã°ã©ãã®ç«¯ã¯éè·¯ã§ãã bs骚ïŒéè·¯ïŒã«ã¯ãè·é¢ïŒæ¬¡ã®äº€å·®ç¹ãŸã§ïŒãš1æ¥ã®ã¹ã«ãŒãããã®ç¹æ§ãå²ãåœãŠãããŸãã
ã³ãŒãã§ã¯ãã°ã©ãã¯é£æ¥ãªã¹ããŸãã¯é£æ¥è¡åã®åœ¢åŒã§è¡šãããŸãã ç°¡åã«ããããã«ã飿¥è¡åã䜿çšããŸãã
[u]ãš
[v]ã®äº€ç¹ã®
飿¥è¡åã§é ç¹ãã1ãã®å Žåããããã®é ç¹ïŒäº€å·®ç¹ïŒã¯ãšããžïŒéè·¯ïŒã§æ¥ç¶ãããŠããããšãæå³ããŸãã ãããªãã¯ã¹ã«æ£ç¢ºã«ã1ããæå®ããå¿
èŠã¯ãããŸãããããšãã°ãè·é¢ãã¹ã«ãŒãããïŒåæ§ã®ãããªãã¯ã¹å
ïŒãªã©ããšããžã«é¢é£ããä»ã®æçšãªæ
å ±ãä¿åããããšã¯éåžžã«äŸ¿å©ã§ãã
ãã®å³ã¯ã䞻察è§ç·ã«é¢ããŠå¯Ÿç§°ãªè¡åã瀺ããŠããŸãã
M [u] [v] = M [v] [u] ããã¯ã
ç¡åã°ã©ããäžããããä»»æã®æ¹åã«ãšããžã«æ²¿ã£ãŠç§»åã§ããããšãæå³ããŸãïŒåŸåŸ©ïŒã è¡å
M [u] [v] = 1ã§ãå察æ¹å
M [u] [v] = 0ã®å Žåãã°ã©ãã¯
æ¹åä»ããããé ç¹
[u]ãã
[v]ãŸã§ã®ã¿ãšããžã«æ²¿ã£ãŠé²ãããšãã§ããŸãã
éè·¯ã®é路容éã¯ãè¡å
C [..] [..]ã«æžã蟌ãŸã
ãŸããããã¯ãäžè¬çã«ã¯æåã°ã©ãã§ãã çµå±ã®ãšããããå·¥å Žãããã空枯ãã®æ¹åã«é転ããã«ã¯éè·¯ãå¿
èŠã§ãã æå®ããã垯åå¹
ïŒãã©ã³ããšç©ºæž¯ïŒãæã€æåã°ã©ãã¯ã
ãããã¯ãŒã¯ãšåŒã°ã
ãŸã ã
ã°ã©ããç¹å®ã®ç¹æ§ãèšç®ããå¿
èŠãããããå
šäœããå€§èŠæš¡ã«ã§ã¯ãªããããé ç¹ããä»ã®é ç¹ãŸã§ã®è·é¢ãæ³å®ããå Žåãé
åã䜿çšãããšäŸ¿å©ã§ãïŒã¡ã¢ãªãå°ãªããªããŸãïŒã ã€ãŸã é
å
dist [..]ã®
[u]ã»ã«ã«ããå·¥å Žããã
[u]äžéšãŸã§ã®è·é¢ãæ ŒçŽãããšããŸãããã åæ§ã«ããã§ã«èšªããé ç¹ãããŒã¯ããïŒ
mark ïŒãæã£ãŠããããã¯ã¹ã®æ°ãèšé²ããïŒ
push ïŒãé ç¹ã«æ¥ãå Žæãèšé²ããïŒ
pred ïŒããã«ãã°ã©ããèµ°æ»ãããšãã«é
åã䜿çšããŸãã
ããã£ã çŽ æŽãããã ããããã°ã©ãã«å€æããæ¹æ³ãç¥ã£ãŠããŸãã ãããŠãã©ããã£ãŠç©ºæž¯ã«ç®±ãå±ããŸããïŒ ãå·¥å Žãããã空枯ããžã®éãèŠã€ããããšãã§ããå¿
èŠããããŸãã ãã®ããã«äœ¿çšããŸã...
å¹
åªå
æ€çŽ¢ã¢ã«ãŽãªãºã ãBFSã
ãããŸã§ã¯ ã垯åå¹
ãšè·é¢ãèæ
®ããã«ãã°ã©ãã®é ç¹ã®é£æ¥é¢ä¿ïŒè¿åïŒ
ã®ã¿ãèæ
®ããŸã ã
BFSã¯ãä»ã®å€ãã®åºç€ãšãªãæãåºæ¬çãªã¢ã«ãŽãªãºã ã®1ã€ã§ãã
ç°¡åãªèª¬æïŒåçã¯äžã«ãããŸãïŒã çŸåšãããã€ãã®éå§ïŒãã©ã³ãïŒããŒã¯
[s]ã«ç«ã£ãŠããŸããããããããšããžã«æ²¿ã£ãŠé£æ¥ããããŒã¯ã®ã¿ã衚瀺ãããŸãã ãããŠãã§ããã ãæ©ããã®ã°ã©ãã®ã©ããã«ããããã
[t]ã«å°éããå¿
èŠããããŸãã æ¬¡ã«ãããè¡ããŸãã ç§ãã¡ã¯ãé£äººã®å±±ã®ç«¯ïŒã€ãŸããèªç±ãªéè·¯ïŒã«æ²¿ã£ãŠèŠãŸãããã®äžã«ã¯
[t]ããããŸãã ããã§ãªãå Žåããæåã«æ€åºãããããã¹ãŠã®ãã€ããŒããããã«è¡ãå¿
èŠãããããã¥ãŒã«èšé²ããŸãã ãã¹ãŠã®é£äººã調ã¹ããšã-ç§ãã¡ã¯ããŒã¯ãããŒã¯-ããã§ã«ããã«ãããã ãã¥ãŒããæåã®æªèšªåã®ããŒã¯ãååŸããããã«è¡ããŸãã
åãæ¹æ³ã§æ€çŽ¢ãç¶ããŸãã åæã«ãäžåºŠèšªããããŒã¯ãç¡èŠããŸãïŒåŸéã§ã¯ãããŸããïŒã éè·¯ã§
[t]ã«åºäŒã£ãã-ãã°ããããç®æšã¯éæãããŸããïŒ
åã亀差ç¹ã«æ°åå
¥ããªãããã«ããããã
mark [..]é
åã§
ããŒã¯ããŸã ã
[u]ããŒã¯ã®è¿åã調ã¹ãåŸã
ããŒã¯[u] = 1ãé
眮ããŸãã ãããã¯ã
[u]çªç®ã®äº€å·®ç¹ãæ¢ã«ã蚪åãããŠããããšãæå³ããŸãã
åçïŒäžéš-ã·ãªã¢ã«çªå·ãèšèŒãããŠããŸãã¢ã«ãŽãªãºã ãå®äºãããšã次ã®å³ã衚瀺ãããŸãã
äž»ãªæ©èœã«æ³šæããŠãã ããã
- åé ç¹ã¯æ£ç¢ºã«ïŒ1å以äžïŒååŸããŸã
- é ç¹ãæåã«è¡šç€ºããããšãã«é ç¹ããã¥ãŒã«å
¥ããŸã
- æ€ç©ããæŸå°ç¶ã«ïŒæ³¢ç¶ã«ïŒã°ã©ãå
ã®ä»ã®é ç¹ãèŠã€ããŸã
- ãæ€æ»ååŸãã¯åžžã«å¢å ããŠããŸã
- ã空枯ããèŠã€ãããšããå·¥å Žããšã空枯ãã®éã®rib骚ïŒéè·¯ïŒã®æ°ã¯æå°éã«ãªããŸãã T.O. ã«ãŠã³ãã®æéæ€æ»ã§ã空枯ããèŠã€ããŸã
- ç§ãã¡ã¯ãããªããç®±ãéã¶ããšãã§ããç¡æã®éè·¯ã ããèŠãŸãïŒ
- ãããšâŠå®éã®è·é¢ïŒèµ°è¡è·é¢ïŒãèæ
®ãããŸã§ã
ããã§ãããããŒãããã¯ã¹ã空枯ã«èŒžéããæ¹æ³ãèŠã€ããæ¹æ³ãããããŸããã ããŠ...ç§ãã¡ã¯ããããéè·¯ã«æ²¿ã£ãŠé£ããŠè¡ãããããå°å³äžã«ããŒã¯ããŸãã ãã®ããŒã¯-ãããã€ã®ç®±ãã©ã®éè·¯ïŒç«¯ïŒãã©ã®éãé²ããããã
ãã㌠ããšåŒã³ãŸãã ãããªãã¯ã¹ïŒ
ãã㌠ïŒ
F [..] [..]ã§ããã«æ³šæã
ãŸã ã ã€ãŸã
[u]ãã
[v ]ãŸã§ã®éäžã§ã
F [u] [v]ç®±ãéã³ãŸãã
çŸå®ã«åºäŒã
æãæ¥ãŸããããããªãã¯ã¹ïŒ
容é ïŒ
C [..] [..]ã§ç€ºãããã垯åå¹
ããèæ
®ããå¿
èŠããã
ãŸã ã å®éã
[u]ãã
[v]ã«åããéäžã§ã
C [u] [v]åã®ç®±ããå¯èŒžã§ããŸããã ããã¯æ®å¿µã§ãã

ç§ãã¡ã¯å
èŠã®æããã£ãŠè¡åããŸããã BFSã§ã空枯ããæ¢ããŠããéãã蚪åããããŒã¯ããããŒã¯ããŠããéãã©ã®äº€å·®ç¹ããå°çããããèšé²ããŸãã
ãããã
pred [..]é
åã«èšé²ããŸããã ã€ãŸã é ç¹
pred [v]ããé ç¹
[v]ã«å°éããŸããã ãããŠã¡ããã©åã«ãå¥ã®äŸ¿å©ãªé
åãéå§ããŸããïŒ
push [v] ãã€ãŸã éè·¯
[u]-[v]ã«æ²¿ã£ãŠäº€å·®ç¹
[v]ã«ããã¯ã¹ãã©ãã ããããã·ã¥ãã§ãããã
ãããŠã圌ãã¯ãããææ°ã®ç¶æ
ã«ä¿ã¡ãŸããïŒ
push [v] = minïŒpush [u]ãC [u] [v] -F [u] [v]ïŒ;ãã®ãããã空枯ããããå·¥å ŽããŸã§ã®è»éãéã®é åºã§ããäžåºŠãã»ã©ããŠãããã®ã«ãŒãã«æ²¿ã£ãŠããã€ã®ç®±ãéã¶ããšãã§ããããèšç®ããå¿
èŠããããŸãã
Push [v] = push ["airport"] = flow = hereïŒ èŠã€ãã£ããã¹ã«æ²¿ã£ãŠç©ºæž¯ã«é
éãããç®±ã®æ°ã ãã¹ãŠã®ãšããžïŒéè·¯ïŒã«æ²¿ã£ãŠã«ãŒããå·»ãæ»ãããã¹ã®ãã¹ãŠã®ãšããžã«ããããŒã
ãããŒã远å ããŸãã
ããããåé¡ã¯ç©ççãªéã«é¢ãããã®ã§ãããç®±ã®æ°ãã¹ã«ãŒããããè·é¢ãªã©ãã
ãã€ãã¹ ãã«çŽé¢ããå¿
èŠããããããããŸãã...
ãããŒãå¢ããïŒãŸãã¯Ford-Fulkersonã¢ã«ãŽãªãºã ïŒ
ããã§ãã°ã©ãã®é ç¹ã®é£æ¥ïŒè¿åïŒããšããžã®æ¹å垯åå¹
ãèæ
®ããŸãããè·é¢ã¯ãŸã èæ
®ããŠããŸããã
ïŒããã¯ã¹ã®ïŒæµããäž
[u]ããäž
[v]ã«å¢ãããšãèªç¶ã«
F [u] [v] + = flowã®æäœãå®è¡ããŸãããå察æ¹åã§ã¯ãæµã
F [v] [u]-=ãã㌠; ãããçç±ã§ãã ãã®ç¶æ³ã¯å¯èœã§ãïŒ
ç»åå
ïŒãšããžäž-çœ²åæžã¿ïŒã¹ããªãŒã /垯åå¹
ïŒåããŠã3ã€ã®ããã¯ã¹ã®ã¹ããªãŒã ãæäžéš
[i]ã«éã³ããšããž
[i]-[j ]ãèŠã€ããŸããïŒ
minã転éããŸãã
ïŒããã·ã¥[i]ãC [i] [j]-F [i] [j]ïŒ = minïŒ3ã3-0ïŒ= 3ããã¯ã¹ãããã
F [i] [j] + = 3ãšããŒã¯ããå察æ¹åã«
F [j] [i]-= 3ãèšå®ããŸãã
2åç®ã¯ãæäžéš
[j]ã§èªåèªèº«ãèŠã€ããŠã
minïŒpush [j]ãC [j] [i] -F [j] [i]ïŒ= minïŒ6ã0-ïŒ-3ïŒïŒ= minïŒ 6ã3
ïŒ= 3ããé ç¹
[i]ãŸã§ ã ã¹ããªãŒã
+3ã«å¯ŸããŠ
-3ããã¯ã¹ãããã·ã¥ãããã®éè·¯ã«æ²¿ã£ããããŒã®è£æ£ãåãåããŸããã ããããæ¬¡ã®å埩ã®ã空枯ãã®æ¹åã«ãæ®ãã®3ã€ã®ããã¯ã¹ã远å ã§éä¿¡ããŸããã
è§£éïŒå庫
[j]ããå庫
[i]ã«é»è©±ããã3ã€ã®ç®±ãèªåçšã«æ®ããŠãã ãããå¥ã®çšéãèŠã€ããŠã代ããã«3ã€æã£ãŠããŸãããã ã¢ã«ãŽãªãºã èªäœã芪åã«ããããèŠã€ããŸãããã
ã¹ããªãŒã ã®æ€çŽ¢ãç¶ããŸãïŒ
ç§ãã¡ã¯ãæåããŠããéãã空枯ããžã®éãæ¢ãç¶ãããããã®äžã«ç®±ãéã¶ããšã«ç¶ç¶çã«åæããŸããã 倧ãŸãã«èšããšãããã¯
æå€§ãããŒæ€çŽ¢ã¢ã«ãŽãªãºã ããŸãã¯
Ford-Fulkersonã¢ã«ãŽãªãºã ãšåŒã°ã
ãŸã ã ãŸããBFSã䜿çšããŠæ°ããé
ä¿¡ã«ãŒãããéãããããããã¯
Edmonds-Karpã¢ã«ãŽãªãºã ãšåŒã°ããŸãã
ç®±ã茞éããŠéè·¯ãå®å
šã«ã飜åãããããšãããŒãããŒã«ã空枯ã«1æ¥äœç®±èŒžéã§ããŸããïŒããšãã質åã«çããŸãã ããããããã¯åœŒãèªèº«ã®æžäŸ¡ååŽè²»ã«ã€ããŠèããæã§ã...ã¿ã€ã€ãã¬ãœãªã³ãæ©è...
BFSãã°ã©ããæ€çŽ¢ãããšããè·é¢ã«ã€ããŠè©±ããŠããå Žåã§ããéæµãªã©ã®è² ã®å€ãåŠçããå¿
èŠãããããšã¯ãã§ã«æããã«ãªã£ãŠããŸãïŒãéèçšèªãã«çµæããããŸãïŒã äžè¬ã«ãè·é¢ãããã«èæ
®ããæéã§ã...
è·é¢ ãžã£ãã¯ãéãé²ãã§ãã ããïŒ
ãã®ã¿ã¹ã¯ãå®å
šã«å®äºããæãæ¥ãŸãã
ïŒã°ã©ãã®é ç¹ã®é£æ¥ïŒè¿åïŒããšããžã®æç€ºãããã¹ã«ãŒããããè·é¢ã
ããã¹ãŠã®æ¹æ³ã§ãåŒãåºãã§éè·¯ãããŒããããŸã§ãBFSãå®è¡ãç¶ããŸãã
ã§ã¯ãäœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããã ã空枯ãåŽãã確èªããŸããããããã¯ã¹ã15 kmã®è·é¢ãè¶
ããŠå°çããå Žåãã€ãŸãæåŠããå Žåã¯15 kmç¯çŽã§ããŸãã æ
è¡ïŒã€ãŸãã15ãåŒãïŒããå¥ã®ç§»åæ¹æ³ãèŠã€ããïŒã¢ã¿ããããïŒå¿
èŠããããŸãã
ã空枯ãããåæ¹ïŒèªç±éè·¯ïŒãšåŸæ¹ïŒæŒãæ»ããŠä¿åïŒã®inéªšã«æ²¿ã£ãŠæ©ããŠã¿ãŸãããã
ç»åïŒãšããž-笊å·ä»ãïŒãããŒ/ã¹ã«ãŒãããïŒãããã³äž-è·é¢äžã®å³ã§ã¯ããè² ã®ãµã€ã¯ã«ã-6ãèŠã€ãããŸãããããŸã å©çšå¯èœãªïŒããªãŒãŸãã¯äžæµã®ïŒãªãã«æ²¿ã£ãŠæ©ãç¶ããŠããŸãã ãã®äžã§1å転ããããšã§ãããã«åå ããé ç¹ã®è·é¢ã-6æžããããšãã§ããŸãã ããã¯ããµã€ã¯ã«ã§èŒžéãããç®±ã®é
éãç¯çŽã§ããããšãæå³ããŸãã ç®±ããã«ãŒãã«å
¥ãããã ãã§ãã äžã®åçã§ã¯ã6 kmç¯çŽã§ããŸãã æ¹æ³ã
ããã§åé¡ã®è§£æ±ºæ¹æ³ãããããŸãããããããã®ãµã€ã¯ã«ãæ€åºããããã«...
ãã«ãã³ãã©ãŒãã¢ã«ãŽãªãºã

é ç¹
[s]ããæ®ãã®é ç¹ãŸã§ã®æçè·é¢ãèŠã€ããããã«äœ¿çšãããŸãã ããããBFSãšã¯ç°ãªããçããã¹ã¯ãã®ãã¹ã«æ²¿ã£ãã°ã©ãã®ãšããžã®æ°ãšããæå³ã§ã¯ãªãããã¹ã®ãšããžã«æ²¿ã£ããè·é¢ãã®åèšãšããæå³ã«ãªããŸãã
ãã ããããã«ã¯å¿
èŠãããŸããã ããã
ãã€ã¯ã¹ãã©ã¢ã«ãŽãªãºã ãšåºå¥ããäž»ãªæ©èœã®1ã€ã¯ããšããžã®éã¿ãè² ã®æ°ã§æå®ã§ããã°ã©ãã§æ©èœããããšã§ãã ã¢ã«ãŽãªãºã ã¯ããã®ãããªã°ã©ãã®å¯äœçšãã€ãŸãè² ã®å€ã®ãµã€ã¯ã«ãæ€åºã§ããŸãã å¿
èŠãªãã®ïŒ
ã¢ã«ãŽãªãºã ã¯ããè€éã§ãã ãã®å®è£
ã¯ãCormenã®èæžãšã¯é¢ä¿ãããŸããããããŸãæ©èœããŸãã èŠãç®ã¯ãBFSã«å€å°äŒŒãŠããããã説æãå§ããããšæããŸãã
ç¹å®ã®é ç¹ããéå§ãããã¢ã¯ã»ã¹å¯èœãªããšããžã«æ²¿ã£ãŠé£æ¥ããé ç¹ãèŠãŠã
dist [..]é
åã§ãããã®è·é¢ãæ¹åããå¯èœãªéãå°ããããŸãã ãã®ããã»ã¹ã¯ãç·©åããšåŒã°ããŸãã ãã®ãããªé ç¹ãïŒãšããžã«æ²¿ã£ãŠïŒãçºèŠãããå Žåãé ç¹ãŸã§ã®è·é¢ãæŽæ°ãããããã®é ç¹ãããããããã®ã°ã©ããæ¹åããŠã¿ãŠãã ããããã¥ãŒã«å
¥ããŸãã BFSã«éåžžã«äŒŒãŠããŸãïŒ ãã ããããŒã¯ãããŒã¯ããŸããïŒãæ¢ã«èšªãããïŒãåãããŒã¯ã«2åè¡ããªããã°ãªããªãå Žåã¯ããããè¡ããŸãã
ããããåé¡ã¯ãããŒã¯ãŸã§ã®è·é¢ãçž®ããæ°žé ã«ã¹ãã³ã§ãããè² ã®ãµã€ã¯ã«ãããããšããäºå®ã«åããŠããŸããïŒ ããã»ã¹ã¯çµäºããŸããã ãããã£ãŠãé ç¹ã®ãæ€æ»ååŸãã¯ãæ°
N ïŒé ç¹èªäœã®æ°ïŒã«ãã£ãŠå¶éãããŸãã ããã¯ãä»»æã®é ç¹ãŸã§ã®æå°è·é¢ãèšç®ããããã«ååã«ä¿èšŒãããæãéèŠãªããšã«ã¯ãã¢ã«ãŽãªãºã ã¯ãããã®å Žåã§ãçµäºããŸãã
ãããè¡ãã«ã¯ãæåã®é ç¹ããã¥ãŒã«å
¥ãããã®åŸã«ãã¹ã¿ããã眮ããŸããããã«ããããã¥ãŒå
ã®é ç¹ããæ€æ»ååŸ0ãã«ããããšã瀺ããŸãã ãã¥ãŒããæ¬¡ã®ããŒã¯ãåãåºããšãçªç¶ããã©ã°ããååŸããŸããæ¬¡ã®ãæ€æ»ååŸããç€ºãæ°ãããã©ã°ãé
眮ããŸãã ããã«ãäžè¬ã«ãã¢ã«ãŽãªãºã ã®å
šäœã®ããžãã¯ããããŸãã =ïŒ
ããŒã¯ãŸã§ã®è·é¢ã®æ¹åã¯ã次ã®äžçåŒã«ãã£ãŠæ€èšŒãããŸãã
dist [v]> dist [u] + edge_costïŒuãvïŒåçïŒãšããžäž-é·ããããã³ããŒã«ããã-çŸæç¹ã§èŠã€ãã£ãæçè·é¢äž»ãªæ©èœã«æ³šæããŠãã ããïŒBFSãšã¯ç°ãªããŸãïŒã
- é äžãŸã§ã®è·é¢ãæ¹åãããŠããã°ãäœåºŠãé äžã«çãããšãã§ããŸãã ãã®åŸããã®ããŒã¯ã«å
¥ã£ãŠããããã§ã«ããŒã¯ããã®è·é¢ãæ¹åããããšããŸã
- è·é¢ãæ¹åãããããŒã¯ã¯ãã¥ãŒã«å
¥ããããŸã
- ãã©ã³ããããè·é¢ã«æ²¿ã£ãŠïŒãšããžã«æ²¿ã£ãŠã§ã¯ãªãïŒæŸå°ç¶ã«ïŒæ³¢ç¶ã«ïŒæ®ãã®ããŒã¯ãèŠã€ããŸã
- ç§ãã¡ã¯ãç®±ã茞éããïŒãŸãã¯æŒãæ»ãïŒããšãã§ããç¡æã®éè·¯ã®ã¿ãèŠãŠãããŸãã ãããã£ãŠãäžããããè·é¢ãšã¹ã«ãŒããã
ãååŸNïŒé ç¹ã®æ°ïŒãã§ã°ã©ãã衚瀺ãããšããã¹ãŠã®é ç¹ã«ã€ããŠæå°è·é¢ãæ€åºãããŸãã ãããŠãããä»¥äžæžãããã®ã¯ãããŸããã ãŸããããŒã¯ã®äžéšããè² ã®ãµã€ã¯ã«ãã«ãåŒã蟌ãŸãããå Žåãå¹³çéåããã§ãã¯ããããšã§ç°¡åã«æ€åºã§ããŸãã å®éããµã€ã¯ã«ã§ã¯ãè·é¢ã¯ç¡éã«æžå°ããŸãã
dist [v]> dist [u] + edge_costïŒuãvïŒãããã£ãŠãé ç¹
[v]ã«å¯ŸããŠãã®äžçåŒãæãç«ã€å Žåãè² ã®ãµã€ã¯ã«ã«åå ããããšãæå³ããŸãã å¿
èŠãªãã®ïŒ ç§ãã¡ãããã«æ²¿ã£ãéã圌女ãããå·»ãæ»ãããç§ãã¡ã¯ïŒåœŒå¥³ã®ïŒãµã€ã¯ã«ã«æ²¿ã£ãŠå転ããŸãã
ãã¹ãŠ-ãµã€ã¯ã«ãçºèŠãããŸããïŒ æ®ã£ãŠããã®ã¯ãããã¯ã¹ã®æµãããåŸæ¹ãã«åããããšã§ããããã«ãããããžãã¹ã®å¹çãåäžããŸãã
æå°ã³ã¹ãæå€§ãããŒã¢ã«ãŽãªãºã ïŒ
- Edmonds-Carp Maximum FlowãèŠã€ãå§ããŸãã
- BFSã¯ãå·¥å Žãããã空枯ããžã®éãèŠã€ããŸã
- ãããŸã§ã®ãšãããBellman-Fordã¢ã«ãŽãªãºã ã¯ãè² ã®ãµã€ã¯ã«ããèŠã€ããŸãã
- ãè² ã®ãµã€ã¯ã«ãã®æµããå
ã«æ»ããŸãã
- æå°ã³ã¹ãïŒè·é¢ïŒã®æå€§ãããŒãååŸããŸãã
ããã ãã§ã ããŒãããŒã«é»è©±ããŠã1æ¥ã«é
éã§ããååã®æ°ããç¥ããããŸãã ãããŠãç¯çŽãããéãã©ã®ããã«é©çšããããèããŸãã =ïŒ
int C[MAX_N][MAX_N]; // " "
int F[MAX_N][MAX_N]; // " "
int P[MAX_N][MAX_N]; // " ()"
int push[MAX_N]; // [v]
int mark[MAX_N]; // ,
int pred[MAX_N]; // [v] ()
int dist[MAX_N]; // [v]
int N, M, s ,t; // - , ,
int max_flow;
int min_cost;
void file_read()
{
int u, v, c, p;
in >> N >> M >> s >> t; N++;
for ( int i = 0; i < M; i++)
{
in >> u >> v >> c >> p;
C[u][v] = c;
P[u][v] = p;
P[v][u] = -p;
}
}
int edge_cost( int u, int v)
{
if ( C[u][v] - F[u][v] > 0 ) return P[u][v];
else return MAX_VAL;
}
int check_cycles()
{
for ( int u = 1; u < N; u++)
for ( int v = 1; v < N; v++)
if ( dist[v] > dist[u] + edge_cost(u, v) )
return u;
return MAX_VAL;
}
void init()
{
for ( int i = 1; i < N; i++)
{
mark[i] = 0;
push[i] = 0;
pred[i] = 0;
dist[i] = MAX_VAL;
}
}
//
int bf( int s)
{
init();
queue< int > Q;
pred[s] = s;
dist[s] = 0;
Q.push(s);
Q.push(MAX_N);
int u, series = 0;
while ( !Q.empty() )
{
while ( Q.front() == MAX_N )
{
Q.pop();
if ( ++series > N ) return check_cycles();
else Q.push(MAX_N);
}
u = Q.front(); Q.pop();
for ( int v = 1; v < N; v++)
if ( dist[v] > dist[u] + edge_cost(u, v) )
{
dist[v] = dist[u] + edge_cost(u, v);
pred[v] = u;
Q.push(v);
}
}
}
// -
int bfs( int s, int t)
{
init();
queue< int > Q;
mark[s] = 1;
pred[s] = s;
push[s] = MAX_VAL;
Q.push(s);
while ( !mark[t] && !Q.empty() )
{
int u = Q.front(); Q.pop();
for ( int v = 1; v < N; v++)
if ( !mark[v] && (C[u][v]-F[u][v] > 0) )
{
push[v] = min(push[u], C[u][v]-F[u][v]);
mark[v] = 1;
pred[v] = u;
Q.push(v);
}
}
return mark[t];
}
// -
void max_flow_ff()
{
int u, v, flow = 0;
while ( bfs(s, t) )
{
int add = push[t];
v = t; u = pred[v];
while ( v != s )
{
F[u][v] += add;
F[v][u] -= add;
v = u; u = pred[v];
}
flow += add;
}
max_flow = flow;
}
//
void min_cost_flow()
{
max_flow_ff();
int u, v, flow = 0;
int add = MAX_VAL;
int neg_cycle;
neg_cycle = bf(t);
while ( neg_cycle != MAX_VAL )
{
v = neg_cycle; u = pred[v];
do
{
add = min(add, C[u][v]-F[u][v]);
v = u; u = pred[v];
}
while ( v != neg_cycle );
v = neg_cycle; u = pred[v];
do
{
F[u][v] += add;
F[v][u] -= add;
v = u; u = pred[v];
}
while ( v != neg_cycle );
neg_cycle = bf(t);
}
for ( int u = 1; u < N; u++)
for ( int v = 1; v < N; v++)
if ( F[u][v] > 0 )
min_cost += F[u][v] * P[u][v];
}
void file_write()
{
out << max_flow << endl;
out << min_cost << endl;
}
void main()
{
file_read();
min_cost_flow();
file_write();
}
* This source code was highlighted with Source Code Highlighter .
//ãããŠããã®ãããªæ¡ä»¶ãæ¡çšããå ŽåïŒããŒã¯-éè·¯ã®äº€å·®ç¹ããšããž-éè·¯ãã¹ã«ãŒããã-è»ç·ã®æ°ïŒèš±å®¹é床ãªã©ïŒãããããã®éè·¯ã®çŸåšã®è»ã®æ°ãåŒãããã®ã ãAãéããããBãéããžã®æå€§ã®æµããèŠã€ããŸã-åžå
ã§çŸåšç¡æã§ã¯ãªãéè·¯ã¯äœã§ããïŒ ãã¡ããããã£ãšå€ãã®ãã©ã¡ãŒã¿ãŒãèæ
®ããå¿
èŠããããŸãããåºæ¬ã¯ã°ã©ãã§ãã ããã¯é¢çœãã§ãã =ïŒ
åèš
ããŸãscãããªãã§ãã ãã
ã°ã©ãã«ã€ããŠã®æçš¿ãå§ãããšããç§ã¯ã©ã®ã¬ãã«ã®èœåã«é Œãã¹ããããããŸããã§ããããããŸã§ã®ãšãããããšãã°ããã€ã¯ã¹ãã©ã«ã€ããŠã¯è©±ããªãããšã«ããŸããã çªç¶ã1ç§ããšã«æèšããŸãã ããããHabr仲éããããã®ã¢ã«ãŽãªãºã ã®å®çšçãªåŽé¢ã«èå³ãæã£ãŠããããšã¯ç¢ºãã«èŠããŠããŸãã ãããã£ãŠã圌ã¯ãç圢ãåé¡ãåãäžãããã®çšèªã§ã°ã©ãã«ã€ããŠæç¢ºã«äŒããããšããŸããã
誰ããã°ã©ããšãã®å¿çšäŸã«ã€ããŠèå³ãæã£ãŠãããããšãé¡ã£ãŠããŸãã ããã«ãæãæåãªããã°ã©ãã³ã°ãªãªã³ããã¯
ACM ICPCã® 1ã€ã«ã€ããŠãåŠçïŒåŠç«¥ïŒãŸãã¯ããã°ã©ãã³ã°ãæãã倧åŠé¢çã«æãåºãããããã«èšäºãæžãããä¿ãããŸããïŒ å€§åŠã®åæã«ãŸã 決ãŸã£ãŠããªãïŒãããŠããªãã£ãïŒäººã®ããã«ãããŒã ãç·šæããã³ã³ãã¥ãŒã¿ã¯ã©ã¹ã§é
ããŸã§èµ·ããã¢ã«ãŽãªãºã ã®æŒžè¿çæåã«ã€ããŠè°è«ãããããã®è§£æ±ºçãšåäŸãèãåºãã ã¢ã«ãŽãªãºã ã¯è峿·±ããã®ã§ãããäžç·ã«éãŸãæ£åœãªçç±ã§ãããããŒã ãã¬ã€ã®çµéšã¯è²Žéã§ãã ä»ããåå ãããïŒ