ããã«ã¡ã¯ãHabrahabrã ããã¯ãç§ã®ããã°ã©ã ã®ãã¬ãŒã ã¯ãŒã¯ã®å¥ã®æçš¿ã§ãæ倧ã®ITãªãœãŒã¹ã®ããŒã¿ããŒã¹ãã¢ã«ãŽãªãºã ãšããŒã¿æ§é ã«é¢ããæ
å ±ã§åŒ·åããŸãã å®è·µã瀺ãããã«ããã®æ
å ±ã¯å€ãã®äººã«ãšã£ãŠååã§ã¯ãªããããã°ã©ãã³ã°ã©ã€ãã®ããŸããŸãªåéã§å¿
èŠãšãããŠããŸãã
ç解ãããããå€ãã®ã³ãŒããå¿
èŠãšããªãã¢ã«ãŽãªãºã /æ§é ãäž»ã«éžæãç¶ããŸãããå®çšçãªäŸ¡å€ãéå°è©äŸ¡ããããšã¯å°é£ã§ãã ååã¯
ãã«ã«ãã®æšã§ããã ä»å
ã¯ãçŽ éåã®ã·ã¹ãã ã§ã ã
ãã£ã¹ãžã§ã€ã³ãã»ãããŠããªã³ ïŒDSUïŒãŸãã¯
Union-FindãšãåŒã°ã
ãŸã ã
ç¶æ
次ã®ã¿ã¹ã¯ãèšå®ããŸãã
Nã¿ã€ãã®èŠçŽ ãæäœããŸãããïŒç°¡åã«ããããã以äžã§ã¯0ããN-1ãŸã§ã®æ°åïŒã æ°ã®ã°ã«ãŒãã¯ã»ããã«çµåãããŸãã æ§é ã«æ°ããèŠçŽ ãè¿œå ããŠãããèªäœãããµã€ãº1ã®ã»ããã圢æããããšãã§ããŸãã æåŸã«ãå®æçã«ããã€ãã®2ã€ã®ã»ããã1ã€ã«ããŒãžããå¿
èŠããããŸãã
ã¿ã¹ã¯ã圢åŒåããŸãã次ã®æäœããµããŒããã
é«éæ§é ãäœæããŸãã
MakeSetïŒXïŒ -æ§é äœã«æ°ããXèŠçŽ ãå°å
¥ãããµã€ãº1ã®ã»ãããããèªäœããäœæããŸãã
FindïŒXïŒ -èŠçŽ Xãå±ããã»ããã®
èå¥åãè¿ããŸã
èå¥åãšããŠããã®ã»ããããèŠçŽ ã1ã€éžæããŸã-ã»ããã®
代衚ã§ã ã åãã»ããã«å¯ŸããŠã代衚ãåããã®ãè¿ãããšãä¿èšŒãããŸããããã§ãªãå Žåãæ§é ãæäœããããšã¯ã§ããŸããïŒïŒ
if (Find(X) == Find(Y))
ãæ£ãããªã
if (Find(X) == Find(Y))
2ã€ã®èŠçŽ ãåãã»ããã«å±ããŠãã
if (Find(X) == Find(Y))
ãã§ãã¯
if (Find(X) == Find(Y))
ããšãã§ããŸãã
UniteïŒXãYïŒ -èŠçŽ XãšYã1ã€ã®æ°ããã»ããã«ãã2ã€ã®ã»ãããçµåããŸãã
å³ã§ã¯ããã®ãããªä»®æ³æ§é ã®åäœã瀺ããŸãã
å®è£
å€å
žçãªDSUã®å®è£
ã¯ã1964幎ã«
ããŒããŒãã®ã£ã©ãŒãš
ãã€ã±ã«ãã£ãã·ã£ãŒã«ãã£ãŠææ¡ãããŸãããããã§ã«1975幎ã«
ãããŒãã¿ãªã¢ã³ã«ãã£ãŠèª¿æ»ãããŸããïŒè€éãã®äžæçãªè©äŸ¡ãå«ãïŒãã¿ãªã¢ã³ãããã€ãã®çµæãæ¹åãã¢ããªã±ãŒã·ã§ã³ãææããŠããŸãã
ããŒã¿æ§é ããã©ã¬ã¹ãã®åœ¢åŒã§ä¿åããŸããã€ãŸããDSUãç¬ç«ããããªãŒã®ã·ã¹ãã ã«å€æããŸãã 1ã€ã®ã»ããã®ãã¹ãŠã®èŠçŽ ã¯1ã€ã®å¯Ÿå¿ããããªãŒã«ãããããªãŒã®ä»£è¡šã¯ãã®ã«ãŒãã§ãããã»ããã®ããŒãžã¯2ã€ã®ããªãŒã1ã€ã«çµåãããã®ã§ãã ããããããââãããã«ããã®ãããªã¢ã€ãã¢ã¯ã2ã€ã®å°ããªãã¥ãŒãªã¹ãã£ãã¯ãšçžãŸã£ãŠãçµæãšããŠçããæ§é ã®é©ãã»ã©é«éã«ã€ãªãããŸãã
ãŸããããªãŒã®åé ç¹ã«ãã®çŽæ¥ã®ç¥å
ïŒããã³ããªãŒXã®ã«ãŒãèªäœïŒãæ ŒçŽããé
å
pãå¿
èŠã§ãã ãã®é
åã®ã¿ã䜿çšãããšãæåã®2ã€ã®DSUæäœãå¹æçã«å®è£
ã§ããŸãã
MakeSetïŒXïŒ
èŠçŽ Xããæ°ããããªãŒãäœæããã«ã¯ããããèªèº«ã®ããªãŒã®ã«ãŒãã§ãããç¥å
ããªãããšã瀺ãã ãã§ååã§ãã
public void MakeSet(int x) { p[x] = x; }
æ€çŽ¢ïŒXïŒ
ããªãŒã®ä»£è¡šã¯ãã®ã«ãŒããšèŠãªãããŸãã 次ã«ããã®ä»£è¡šãèŠã€ããã«ã¯ãã«ãŒãã«ã€ãŸãããŸã§èŠªãªã³ã¯ãäžåãã°ååã§ãã
ããããããããã¹ãŠã§ã¯ãããŸãããçž®éããïŒã€ã³ã©ã€ã³ã«æ¡åŒµãããïŒããªãŒã®å Žåã®ãã®ãããªåçŽãªå®è£
ã¯ãOïŒNïŒã§æ©èœããŸãããããã¯åãå
¥ããããŸããã æ€çŽ¢ãé«éåããããšãã§ããŸãã ããšãã°ãçŽæ¥ã®ç¥å
ã ãã§ãªãã察æ°ã®å€§ããªããŒãã«ãæ ŒçŽããã«ã¯ã倧éã®ã¡ã¢ãªãå¿
èŠã§ãã ãŸãã¯ãç¥å
ã«ãªã³ã¯ãã代ããã«ãã«ãŒãèªäœãžã®ãªã³ã¯ãä¿åããŸã-ãã ããããªãŒãçµåããå ŽåïŒUniteïŒãããªãŒã®1ã€ã®èŠçŽ ã¯ãã¹ãŠãããã®ãªã³ã¯ãå€æŽããå¿
èŠããããŸããããããOïŒNïŒã®ãªãŒããŒã®æéæ¶è²»ã§ãã
ä»ã®æ¹æ³ã䜿çšããŸããå®è£
ãé«éåãã代ããã«ãããªãŒå
ã®é床ã«é·ããã©ã³ããé²ãããã«ããŸãã ããã¯æåã®DSUãã¥ãŒãªã¹ãã£ãã¯ã§ããããã¹å§çž®ãšåŒã°ããŸãã ãã¥ãŒãªã¹ãã£ãã¯ã®æ¬è³ªïŒä»£è¡šããŸã èŠã€ãã£ãåŸãXããã«ãŒããŸã§ã®ãã¹ã«æ²¿ã£ãåé ç¹ã«ã€ããŠãå
ç¥ããã®ä»£è¡šã«å€æŽããŸãã ã€ãŸããå®éã«ã¯ãã«ãŒããžã®é·ãåå²ã®ä»£ããã«ãããããã¹ãŠã®é ç¹ãåãµã¹ãã³ãããŸãã ãããã£ãŠãæ€çŽ¢æäœã®å®è£
ã¯2ãã¹ã«ãªããŸãã
ãã®å³ã¯ãæ€çŽ¢ïŒ3ïŒæäœã®ååŸã®ããªãŒã瀺ããŠããŸãã èµ€ãrib骚-ã«ãŒããžã®ãã¹ã«æ²¿ã£ãŠæ©ããthose骚ã ä»ããããã¯ãªãã€ã¬ã¯ããããŸãã ãã®åŸãæšã®é«ããåçã«æžå°ããããšã«æ³šç®ããŠãã ããã
ãœãŒã¹ã³ãŒããååž°çãªåœ¢åŒã§èšè¿°ããã®ã¯éåžžã«ç°¡åã§ãã
public int Find(int x) { if (p[x] == x) return x; return p[x] = Find(p[x]); }
çµåïŒXãYïŒ
2ã€ã®ããªãŒã®å䜵ã«ãããå°ã工倫ãå ããããŸããã æåã«ããã§ã«èšè¿°ãããŠããFindé¢æ°ã䜿çšããŠãäž¡æ¹ã®ããŒãžããªãŒã®ã«ãŒããæ€çŽ¢ããŸãã ããŠãå®è£
ã¯ããªãŒãããŒãžããããã«çŽæ¥ã®èŠªãžã®åç
§ã®ã¿ãä¿åããããšãæãåºããŠãæ¯åã®ã«ãŒãã®1ã€ïŒããã³ããªãŒå
šäœïŒãä»ã®åã«äžæããã ãã§ååã§ãã ãããã£ãŠããã®ããªãŒã®ãã¹ãŠã®èŠçŽ ã¯èªåçã«å¥ã®èŠçŽ ã«å±ããŸã-代衚è
ã®æ€çŽ¢æé ã¯ãæ°ããããªãŒã®ã«ãŒããè¿ããŸãã
åé¡ã¯æ¬¡ã®ãšããã§ããã©ã®ããªãŒã«ã¶ãäžãããã ããšãã°ãããªãŒXã®ããã«åžžã«1ã€ãéžæããã®ã¯è¯ããããŸãããNåã®ãŠããªã³ã®åŸãçž®éããªãŒïŒNèŠçŽ ã®1ã€ã®ãã©ã³ãïŒãååŸããäŸãèŠã€ããã®ã¯ç°¡åã§ãã ãããŠãæšã®é«ããæžããããšãç®çãšãã2çªç®ã®DSUãã¥ãŒãªã¹ãã£ãã¯ããããŸãã
å
ç¥ã«å ããŠãå¥ã®
ã©ã³ã¯é
åãä¿åããŸãã ãã®äžã«ã¯ãåããªãŒã«å¯ŸããŠããã®é«ãã®äžéãã€ãŸããã®äžã®æé·ã®ãã©ã³ããä¿åãããŸãã ããã¯é«ããã®ãã®ã§ã¯ãªãããšã«æ³šæããŠãã ãã-Findãå®è¡ããéçšã§ãæé·ã®ãã©ã³ãã¯èªå·±ç Žå£ããå¯èœæ§ããããæ°ããæé·ã®ãã©ã³ããèŠã€ããããã«ããã«å€ãã®å埩ãè²»ããããšã¯ããŸãã«ãé«äŸ¡ã§ãã ãããã£ãŠãã©ã³ã¯é
åã®åã«ãŒãã«ã¯ããã®ããªãŒã®é«ã以äžã§ããããšãä¿èšŒãããæ°å€ãæžã蟌ãŸããŸãã
ããŒãžã®æ±ºå®ã¯ç°¡åã«ãªããŸãããDSUã§é·ããããã©ã³ããé²ãããã«ãäžäœã®ããªãŒãäžäœã®ããªãŒããã¶ãäžããŸãã ãããã®é«ããçããå Žå-誰ãã誰ãæãããã¯é¢ä¿ãããŸããã ããããåŸè
ã®å Žåãæ°ããäœæãããã«ãŒãã¯ã©ã³ã¯ãäžããããšãå¿ããŠã¯ãªããŸããã
ããã¯ãå
žåçãªUniteãã©ã®ããã«çæããããã§ãïŒããšãã°ããã©ã¡ãŒã¿ãŒ8ãš19ã§ïŒïŒ
public void Unite(int x, int y) { x = Find(x); y = Find(y); if (rank[x] < rank[y]) p[x] = y; else { p[y] = x; if (rank[x] == rank[y]) ++rank[x]; } }
ãã ããå®éã«ã¯ãã©ã³ã¯ã®è©æ¬ºã«è¿œå ã®OïŒNïŒã¡ã¢ãªãè²»ããããšã¯ã§ããŸããã åæžæ¿ã®ã«ãŒãã
ã©ã³ãã ã«éžæããã ãã§ååã§ã-é©ãã¹ãããšã«ããã®ãœãªã¥ãŒã·ã§ã³ã¯ãå®éã«ã¯å
ã®ã©ã³ãã³ã°ã®å®è£
ãšéåžžã«å¹æµããé床ãæäŸããŸãã ãã®èšäºã®èè
ã¯ãç涯ã«ããã£ãŠã©ã³ãã åDSUã䜿çšããŠããŸãããã倱æããããšã¯äžåºŠããããŸããã§ããã
CïŒå®è£
ïŒ
public void Unite(int x, int y) { x = Find(x); y = Find(y); if (rand.Next() % 2 == 0) Swap(ref x, ref y); p[x] = y; }
æ§èœ
2ã€ã®ãã¥ãŒãªã¹ãã£ãã¯ã®äœ¿çšã«ãããåæäœã®é床ã¯ããªãŒã®æ§é ãšã以åã«å®è¡ãããæäœã®ãªã¹ãã®ããªãŒã®æ§é ã«å€§ããäŸåããŸãã å¯äžã®äŸå€ã¯MakeSetã§ã-ãã®åäœæéã¯æããã«OïŒ1ïŒã§ã:-)ä»ã®2ã€ã®å Žåãé床ã¯éåžžã«æçœã§ãã
Robert Taryanã¯1975幎ã«æ³šç®ãã¹ãäºå®ã蚌æããŸããããµã€ãºNã®ãã©ã¬ã¹ãã§ã®FindãšUniteã®äž¡æ¹ã®æäœæéã¯OïŒÎ±ïŒNïŒïŒã§ãã
æ°åŠã®Î±ïŒNïŒã®äžã«ã¯ãéã¢ãã«ãŒãã³é¢æ°ãã€ãŸã
fïŒNïŒ= AïŒNãNïŒã®éé¢æ°ããããŸãã
ã¢ãã«ãŒãã³ã®é¢æ° AïŒNãMïŒã¯ã巚倧ãªæé·çãæã€ããšãç¥ãããŠããŸãã ããšãã°ã
AïŒ4ã4ïŒ= 2 2 2 65536 -3ã®å Žåããã®æ°å€ã¯éåžžã«å€§ãããªããŸãã äžè¬ã«ãèãããããã¹ãŠã®Nã®å®çšçãªå€ã«å¯ŸããŠããã®éã¢ãã«ãŒãã³é¢æ°ã¯5ãè¶
ããŸããããããã£ãŠããããå®æ°ãšããŠåãã
OïŒÎ±ïŒNïŒïŒâ
OïŒ1ïŒãšä»®å®ã§ããŸãã
ã ããç§ãã¡ã¯æã£ãŠããŸãïŒ
MakeSetïŒXïŒ-OïŒ1ïŒã
æ€çŽ¢ïŒXïŒ-OïŒ1ïŒã¯ååŽãããŸãã
çµåïŒXãYïŒ-OïŒ1ïŒååŽæžã¿ã
ã¡ã¢ãªæ¶è²»-OïŒNïŒã
å
šç¶æªããªã:-)
å®çšçãªã¢ããªã±ãŒã·ã§ã³
DSUã«ã¯ããŸããŸãªçšéããããŸãã ãããã®ã»ãšãã©ã¯ã
ãªãã©ã€ã³ã§åé¡ã解決ããããšã«é¢é£ããŠããŸããã€ãŸããããã°ã©ã ãåãåãæ§é ã«é¢ããã¯ãšãªã®ãªã¹ããäºåã«ããã£ãŠããå Žåã§ãã ããã§ã¯ããããã®ã¿ã¹ã¯ã®ããã€ããšããœãªã¥ãŒã·ã§ã³ã®ç°¡åãªã¢ã€ãã¢ã瀺ããŸãã
æå°ééã®ã¹ã±ã«ãã³
éã¿ä»ããšããžãæã€ç¡åæ¥ç¶ã°ã©ããäžããããŸãã çµæãšããŠããªãŒãååŸãããã®ããªãŒã®ãšããžã®ç·ééãæå°ã«ãªãããã«ãããããããã€ãã®ãšããžãã¹ããŒããŸãã
ãã®ã¿ã¹ã¯ãçºçããæ¢ç¥ã®å Žæã®1ã€ã¯ïŒç°ãªãæ¹æ³ã§è§£æ±ºãããŸããïŒãã€ãŒãµããããããã¯ãŒã¯å
ã®åé·æ¥ç¶ããããã¯ããŠãèµ·ããåŸããã±ãããµã€ã¯ã«ãåé¿ããããšã§ãã ãã®ç®çã®ããã«äœæããããããã³ã«ã¯åºãç¥ãããŠãããäž»èŠãªå€æŽã®ååãã·ã¹ã³ã«ãã£ãŠè¡ãããŠããŸãã 詳现ã«ã€ããŠã¯ã
ã¹ããã³ã°ããªãŒãããã³ã«ãåç
§ããŠãã ããã
ãã®å³ã¯ãæå°ã¹ã±ã«ãã³ã匷調衚瀺ãããéã¿ä»ãã°ã©ãã瀺ããŠããŸãã
ãã®åé¡ã解決ããããã®ã¯ã©ã¹ã«ã«ã®ã¢ã«ãŽãªãºã ïŒãã¹ãŠã®ãšããžãéã¿ã®æé ã§ãœãŒãããDSUã䜿çšããŠçŸåšã®æå°éã¿ã®ãã©ã¬ã¹ããç¶æããŸãã æåã«ãDSUã¯Nåã®ããªãŒã§æ§æãããããããã«1ã€ã®é ç¹ããããŸãã rib骚ã«æ²¿ã£ãŠæé ã«è¡ããŸãã çŸåšã®ãšããžãç°ãªãã³ã³ããŒãã³ããçµåããŠããå Žåããããã1ã€ã«ããŒãžããã³ã¢ã®èŠçŽ ãšããŠãšããžãèšæ¶ããŸãã ã³ã³ããŒãã³ãã®æ°ã1ã«éãããšããã«ãç®çã®ããªãŒãæ§ç¯ããŸããã
Tarjanã®LCAãªãã©ã€ã³æ€çŽ¢ã¢ã«ãŽãªãºã
ããªãŒãšæ¬¡ã®åœ¢åŒã®ã¯ãšãªã®ã»ãããæå®ããŸããæå®ãããé ç¹
uããã³
vã«ã€ã㊠ãæãè¿ãå
±éã®ç¥å
ïŒæå°å
±éã®ç¥å
ãLCAïŒãè¿ããŸãã ã¯ãšãªã®ã»ããå
šäœã¯äºåã«ããã£ãŠããŸãã ã¿ã¹ã¯ã¯ãªãã©ã€ã³ã§äœæãããŸãã
ããªãŒãæ·±ãæ€çŽ¢ããããšããå§ããŸãããã ã¯ãšãª<uãv>ãæ€èšããŠãã ããã æ·±ãã®æ€çŽ¢ããèŠæ±é ç¹ã®1ã€ïŒããšãã°uïŒã以åã«æ€çŽ¢ã§æ¢ã«èšªããŠããŠãæ€çŽ¢ã®çŸåšã®é ç¹ãvã§ããããµãããªãŒvå
šäœãã¡ããã©èª¿ã¹ãããç¶æ
ã«ããŸãã æããã«ãèŠæ±ã«å¯Ÿããå¿çã¯ãé ç¹vèªäœãŸãã¯ãã®ç¥å
ã®ããããã§ãã ããã«ãã«ãŒããžã®ãã¹ã«æ²¿ã£ãåç¥å
vã¯ããããçãã§ããé ç¹uã®ç¹å®ã®ã¯ã©ã¹ãçæããŸãããã®ã¯ã©ã¹ã¯ããã®ãããªç¥å
ã®ãå·ŠåŽã®ãæ¢ã«è¡šç€ºãããããªãŒãã©ã³ããšãŸã£ããåãã§ãã
å³ã§ã¯ãé ç¹ãã¯ã©ã¹ã«åå²ãããããªãŒãèŠãããšãã§ããŸãããçœãé ç¹ã¯ãŸã 衚瀺ãããŠããŸããã
ãã®ãããªé ç¹ã®ã¯ã©ã¹ã¯äº€å·®ããŸãããã€ãŸãããããã¯DSUã§ãµããŒããããŸãã æ·±ãæ€çŽ¢ããµãããªãŒããæ»ããšããã«ããã®ãµãããªãŒã®ã¯ã©ã¹ãçŸåšã®é ç¹ã®ã¯ã©ã¹ãšããŒãžããŸãã ãããŠãçããæ¢ãããã«ã
ç¥å
é
åããµããŒãããŸã-åé ç¹ã«å¯ŸããŠããã®é ç¹ã®ã¯ã©ã¹ãçæããç¥å
ã®åºæè
ã 代衚ã®ãã®é
åã®ã»ã«å€ã¯ãããªãŒãããŒãžãããšãã«æžãæããå¿ããŠã¯ãªããŸããã ããããä»ã§ã¯ãå®å
šã«åŠçãããåé ç¹vã詳现ã«æ€çŽ¢ããããã»ã¹ã§ãã¯ãšãªãªã¹ãã§ãã¹ãŠã®<uãv>ãèŠã€ããããšãã§ããŸããããã§ãuã¯æ¢ã«åŠçãããçããåºåããŸãïŒ
Ancestor[Find(u)]
ã
ãã«ãã°ã©ãã®æ¥ç¶ã³ã³ããŒãã³ã
ãã«ãã°ã©ãïŒé ç¹ã®ãã¢ãè€æ°ã®çŽæ¥ãšããžã§æ¥ç¶ã§ããã°ã©ãïŒãäžãããããããã€ãã®ãšããžãåé€ãããã³ãã°ã©ãã«çŸåšæ¥ç¶ãããŠããã³ã³ããŒãã³ãã®æ°ããšãã圢åŒã®ã¯ãšãªãåä¿¡ãããŸããã¯ãšãªã®ãªã¹ãå
šäœãäºåã«ããã£ãŠããŸãã
解決çã¯ããããªããšã§ãã ãŸãããã¹ãŠã®åé€ãªã¯ãšã¹ããå®è¡ããæçµçãªã°ã©ãã®ã³ã³ããŒãã³ãæ°ãèšç®ããŠããããèšæ¶ããŸãã çµæã®ã°ã©ããDSUã«ããã·ã¥ããŸãã ããã§ãéã®é åºã§åé€èŠæ±ã«é²ã¿ãŸããå€ãã°ã©ãããã®åãšããžã®åé€ã¯ãDSUã«æ ŒçŽãããããã©ãã·ã¥ããã¯ã°ã©ããã®2ã€ã®ã³ã³ããŒãã³ãã®ããŒãžã®
å¯èœæ§ãæå³ããŸãã ãã®å ŽåãçŸåšæ¥ç¶ãããŠããã³ã³ããŒãã³ãã®æ°ã¯1ã€æžå°ããŸãã
ç»åã®ã»ã°ã¡ã³ããŒã·ã§ã³
ç»åãèããŠã¿ãŸããã-ãã¯ã»ã«ã®é·æ¹åœ¢ã®é
åã ã°ãªããã°ã©ããšããŠè¡šãããšãã§ããŸããåé ç¹ãã¯ã»ã«ã¯ã4ã€ã®æãè¿ãé£æ¥ãããšããžã§çŽæ¥æ¥ç¶ãããŠããŸãã ã¿ã¹ã¯ã¯ãããšãã°åãè²ã®ç»åå
ã®åãã»ãã³ãã£ãã¯ãŸãŒã³ã匷調衚瀺ãã2ã€ã®ãã¯ã»ã«ãåããŸãŒã³ã«ãããã©ããããã°ããå€æã§ããããã«ããããšã§ãã ããšãã°ãå€ãçœé»ã®ãã£ã«ã ã¯ãã€ã³ããããŸãããŸããã°ã¬ãŒã®è²èª¿ãã»ãŒåãé åãéžæããå¿
èŠããããŸãã
ãã®åé¡ã解決ããã«ã¯2ã€ã®æ¹æ³ããããã©ã¡ããDSUã䜿çšããŸãã æåã®ãªãã·ã§ã³ã§ã¯ãé£æ¥ãããã¯ã»ã«ã®åãã¢éã§ã¯ãªããè²ãååè¿ããã¯ã»ã«éã«ã®ã¿ãšããžãæç»ããŸãã ãã®åŸãã°ã©ãã®éåžžã®é·æ¹åœ¢ã®èµ°æ»ãDSUãåããæ¥ç¶ãããã³ã³ããŒãã³ãã®ã»ãããååŸããŸã-ãããã¯åãè²ã®ç»åé åã§ãã
2çªç®ã®ãªãã·ã§ã³ã¯ããæè»ã§ãã rib骚ãå®å
šã«åé€ããããã§ã¯ãããŸããããããããã®color骚ã«ãè²ã®éãããã®ä»ã®è¿œå ã®èŠå ã«åºã¥ããŠèšç®ãããéã¿ãå²ãåœãŠãŸã-ç¹å®ã®åã»ã°ã¡ã³ããŒã·ã§ã³ã¿ã¹ã¯ã«åºæã§ãã åŸãããã°ã©ãã§ã¯ãããšãã°åãã¯ã©ã¹ã«ã«ã¢ã«ãŽãªãºã ã䜿çšããŠãæå°ã®éã¿ã®ãã©ã¬ã¹ããèŠã€ããã ãã§ååã§ãã å®éã«ã¯ãçŸåšã®æ¥ç¶ãšããžãDSUã«èšé²ãããã®ã§ã¯ãªããçŸæç¹ã§2ã€ã®ã³ã³ããŒãã³ããå¥ã®ç¹å¥ãªéã¿é¢æ°ã®æšæºã«ãã£ãŠããŸãå€ãããªããã®ã®ã¿ãèšé²ãããŸãã
ã©ããªã³ã¹ãžã§ãã¬ãŒã·ã§ã³
ã¿ã¹ã¯ïŒ1ã€ã®å
¥åãš1ã€ã®åºåãæã€è¿·è·¯ãçæããŸãã
ãœãªã¥ãŒã·ã§ã³ã¢ã«ãŽãªãºã ïŒ
å
¥ãå£ãšåºå£ãé€ããã¹ãŠã®å£ãèšçœ®ãããç¶æ
ããå§ããŸãããã
ã¢ã«ãŽãªãºã ã®åã¹ãããã§ãã©ã³ãã ãªå£ãéžæããŸãã éã«ããã»ã«ããŸã æ¥ç¶ãããŠããªãå ŽåïŒDSUã®ç°ãªãã³ã³ããŒãã³ãã«ããå ŽåïŒããããç Žæ£ããŸãïŒã³ã³ããŒãã³ããããŒãžããŸãïŒã
ç¹å®ã®åæç¶æ
ãŸã§ããã»ã¹ãç¶è¡ããŸããããšãã°ãå
¥åãšåºåãæ¥ç¶ãããŠããå Žåãªã©ã§ãã ãŸãã¯ã1ã€ã®ã³ã³ããŒãã³ããæ®ã£ãŠããå Žåã
ã·ã³ã°ã«ãã¹ã¢ã«ãŽãªãºã
FindïŒXïŒã«ã¯ã2ã€ã§ã¯ãªã1ã€ã®ã«ãŒããžã®ãã¹ãå¿
èŠãšããããåããŸãã¯ã»ãŒåãçšåºŠã®ããã©ãŒãã³ã¹ãä¿æããå®è£
ãªãã·ã§ã³ããããŸãã ãããã¯ããã¹å§çž®ãšã¯å¯Ÿç
§çã«ãããªãŒã®é«ããæžããããã®ä»ã®æŠç¥ãå®è£
ããŸãã
ãªãã·ã§ã³ïŒ1ïŒ
ãã¹åå² ã äžäœXããã«ãŒããžã®éäžã§ãåé ç¹ã®èŠªæ¥ç¶ãç¥å
ããç¥å
ïŒç¥ç¶ïŒã®ç¥å
ã«ãªãã€ã¬ã¯ãããŸãã
ãªãã·ã§ã³çªå·2ïŒ
ãã¹ã®åå ã ãã ãããã¹åå²ã®èãæ¹ãåãå
¥ããŠããã¹ã«æ²¿ã£ããã¹ãŠã®é ç¹ã®æ¥ç¶ã§ã¯ãªãããªãã€ã¬ã¯ãå
ã®æ¥ç¶ã®ã¿ãã€ãŸããç¥ç¶ãã®æ¥ç¶ããªãã€ã¬ã¯ãããŸãã
å³ã§ã¯åãããªãŒã䜿çšãããæ€çŽ¢ïŒ3ïŒã¯ãšãªãå®è¡ãããŸãã äžå€®ã§ã¯ãçµæã¯å³åŽã®ãã¹åå²ã䜿çšããŠè¡šç€ºãããŸã-ãã¹ã¯ååã«ãªããŸãã
æ©èœå®è£
ã°ãã°ãã®ã»ããã®ã·ã¹ãã ã«ã¯1ã€ã®å€§ããªæ¬ ç¹ããããŸããããã¯ãåœä»€åã¹ã¿ã€ã«ã§å®è£
ããããããã©ã®ãããªåœ¢åŒã§ãUndoæäœããµããŒãããŸããã åæäœããã®å Žã§æ§é ãå€æŽãããå¿
èŠãªå€æŽãè¡ããããããã«å€æŽãããæ°ããæ§é ãè¿ãå Žåãæ©èœã¹ã¿ã€ã«ã®DSUãå®è£
ããæ¹ãã¯ããã«äŸ¿å©ã§ãïŒå€ãæ§é ãšæ°ããæ§é ã®ã¡ã¢ãªã®ã»ãšãã©ã¯å
±éã§ãïŒã ãã®ãããªããŒã¿æ§é ã¯ãè±èªã®çšèªã§ã¯
æ°žç¶ãšåŒã°ããããŒã¿ã®äžå€æ§ã®æŠå¿µãæ¯é
ããçŽç²ãªé¢æ°åããã°ã©ãã³ã°ã§åºã䜿çšãããŠããŸãã
DSUã¢ã«ãŽãªãºã ã®çŽç²ã«å¿
é ã®ã¢ã€ãã¢ã®ããããã®æ©èœã®å®è£
ã¯ãããã©ãŒãã³ã¹ãç¶æããªãããé·ãéèããããªãããã«æãããŸããã ãããã2007幎ã«ãSylvain ConchonãšJean-ChristopheFilliâtreã¯ã圌ãã®ç 究ã§ãUniteæäœãå€æŽãããæ§é ãè¿ãå¿
èŠãªæ©èœçå€åœ¢ãæ瀺ããŸããã æ£çŽã«èšããšãå®å
šã«æ©èœããŠããããã§ã¯ãªããåœä»€åã®å²ãåœãŠã䜿çšããŠããŸãããå®è£
å
ã«å®å
šã«é ãããŠãããæ°žç¶çãªDSUã€ã³ã¿ãŒãã§ã€ã¹ã¯çŽç²ã«æ©èœããŠããŸãã
å®è£
ã®äž»ãªã¢ã€ãã¢ã¯ããæ°žç¶é
åããå®è£
ããããŒã¿æ§é ã®äœ¿çšã§ãããããã¯ãé
åãšåãæäœããµããŒãããŸãããã¡ã¢ãªãå€æŽãããå€æŽãããæ§é ãè¿ããŸãã ãã®ãããªé
åã¯ãäœããã®ããªãŒã䜿çšããŠç°¡åã«å®è£
ã§ããŸããããã®å Žåãããã䜿çšããæäœã«ã¯OïŒlog
2 NïŒæéããããDSUã®å Žåããã®ãããªæšå®ã¯ãã§ã«é床ã«å€§ãããªããŸãã
æè¡çãªè©³çŽ°ã«ã€ããŠã¯ãèªè
ã¯
å
ã®èšäºãåç
§ããŠ
ãã ãã ã
æåŠ
ãã®èšäºã®ç¯å²å
ã®äºãã«çŽ ãªéåã®ã·ã¹ãã ã¯ãæåãªæ¬-KormenãLeisersonãRivestãStein "AlgorithmsïŒconstruction and analysisã"ã§è°è«ãããŠããŸãã ãŸããæäœã®å®è¡ã«çŽÎ±ïŒNïŒæéããããšãã蚌æ ããããŸãã
Maxim Ivanovã®
ãµã€ã㧠ãC ++ã§ã®DSUã®å®å
šãªå®è£
ãèŠã€ããããšãã§ããŸãã
Union-Find Problemã®
åŸ
æ©ããªãŒäžŠåã¢ã«ãŽãªãºã ã®èšäºã§ã¯ãDSUå®è£
ã®äžŠåããŒãžã§ã³ã«ã€ããŠèª¬æããŠããŸãã ã¹ã¬ããããã¯ã¯ãããŸããã
ãæž
èŽããããšãããããŸãã:-)