ÃÖ´Ü °æ·Î ¹®Á¦


ÇÔ¼ö¸í
apsp¡¡¸ðµç Á¤Á¡À¸·Î ´ëÇÏ´Â ÃÖ´Ü °æ·Î ¹®Á¦(All-Pairs Shortest Paths Problem, APSP ¹®Á¦). Áï, ¸î°³ÀÇ ½Ã°¡ ÀÖ¾î, ½Ã¿Í ½Ã¿ÍÀÇ »çÀÌÀÇ °Å¸®¸¦ ¾Ë ¼ö ÀÖ¾úÀ» ¶§, ¾î´À ½Ã·ÎºÎÅÍ ´Ù¸¥ ½Ã±îÁöÀÇ ÃÖ´Ü °Å¸®¸¦ ¿ä±¸ÇÏ´Â ¹®Á¦ÀÌ´Ù.

Çü½Ä
void apsp(int *shortest, int *distance, int numOfCity);
Àμö
shortest   (Ãâ·Â) ÃÖ´Ü °Å¸®°¡ µé¾î°¡ ÀÖ´Â ¹è¿­
distance   (ÀÔ·Â) ½Ã¿Í ½Ã¿ÍÀÇ Á÷Á¢ °Å¸®
numOfCity  (ÀÔ·Â) ½ÃÀÇ ¼ö
ÇÔ¼öÄ¡
¾øÀ½
ÁÖÀÇ »çÇ×
Àμö shortest, distance ´Â numOfCity X numOfCity ÀÇ 2 Â÷¿ø ¹è¿­ÀÇ »ý°¢À¸·Î ÀÌ¿ëÇϽʽÿÀ. ½Ã¿¡ ¹øÈ£ 1 ~ n ¸¦ ³ª´©¾î °ÅÀýÇßÀ» ¶§,
    distance[0]            ½Ã 1À¸·ÎºÎÅÍ ½Ã 1±îÁö(ÀÚ±â Àڽſ¡°Ô)ÀÇ °Å¸®
    distance[1]            ½Ã 1À¸·ÎºÎÅÍ ½Ã 2±îÁöÀÇ °Å¸®
    distance[numOfCity-1]  ½Ã 1À¸·ÎºÎÅÍ ½Ã n±îÁöÀÇ °Å¸®
    distance[numOfCity]    ½Ã 2·ÎºÎÅÍ ½Ã 1±îÁöÀÇ °Å¸®
    distance[numOfCity+1]  ½Ã 2·ÎºÎÅÍ ½Ã 2(ÀÚ±â Àڽſ¡°Ô)ÀÇ °Å¸®
µÈ´Ù. Áï, numOfCity ºÐÀÇ ¹è¿­ ¿ä¼Ò ¸¶´Ù, ¾î´À ½Ã·ÎºÎÅÍ ´Ù¸¥ ¸ðµÎ ÀÇ ½Ã¿¡ÀÇ °Å¸®°¡ distance ¹è¿­¿¡ µé¾î°¡ ÀÖ´Ù.
µ¡ºÙ¿© ÀÚ±â Àڽſ¡°Ô·ÎÀÇ °Å¸®´Â Ç×»ó 0À̸ç, ÀÌÄ¡¸¶ÀÇ Á÷Á¢ °æ·Î°¡ ¾øÀ» ¶§´Â, ¹«ÇÑ´ëÀÇ »ý°¢À¸·Î Å« °ªÀ» »ç¿ëÇϸé(ÀÚ) ÁÁ´Ù.

¿ë·Ê
¿ë·Ê ÇÁ·Î±×·¥(apsp-test.c )

»ç¿ë¹ýÀÔ´Ï´Ù¸¸, ¿ì¼± µ¥ÀÌÅÍ ÆÄÀÏÀ» ÁغñÇØ µÐ´Ù. ½ÃÀÇ ¼ö¸¦ µ¥ÀÌÅÍ ÆÄÀÏÀÇ 1Çà°¿¡ ¾´´Ù. 2Çà°ºÎÅÍ´Â 1Çà ¸¶´Ù °¢ ½Ã°£ÀÇ °Å¸®¸¦ ¾´´Ù. 2 ÀÌÄ¡¸¶ÀÇ Á÷Á¢ °æ·Î°¡ ¾øÀ» ¶§´Â, ¹«ÇÑ´ëÀÇ »ý°¢À¸·Î Å« ¼ýÀÚ(¿¹¸¦ µé¾î 20000)À» »ç¿ëÇÑ´Ù.

    3        <-- ½ÃÀÇ ¼ö
    0        <-- ½Ã 1À¸·ÎºÎÅÍ ½Ã 1(ÀÚ±â ÀÚ½Å)¿¡ÀÇ °Å¸®
    20       <-- ½Ã 1À¸·ÎºÎÅÍ ½Ã 2¿¡ÀÇ °Å¸®
    20000    <-- ½Ã 1À¸·ÎºÎÅÍ ½Ã 3¿¡ÀÇ °Å¸®(Á÷Á¢ °æ·Î°¡ ¾ø±â ¶§¹®¿¡, ¹«ÇÑ´ë)
    20       <-- ½Ã 2·ÎºÎÅÍ ½Ã 1¿¡ÀÇ °Å¸®
    0        <-- ½Ã 2·ÎºÎÅÍ ½Ã 2(ÀÚ±â ÀÚ½Å)¿¡ÀÇ °Å¸®
    10       <-- ½Ã 2·ÎºÎÅÍ ½Ã 3¿¡ÀÇ °Å¸®
    25       <-- ½Ã 3À¸·ÎºÎÅÍ ½Ã 1¿¡ÀÇ °Å¸®(ÆíÅëÇàÀÇ ±æÀº ÀÖ´Ù)
    10       <-- ½Ã 3À¸·ÎºÎÅÍ ½Ã 2¿¡ÀÇ °Å¸®
    0        <-- ½Ã 3À¸·ÎºÎÅÍ ½Ã 3(ÀÚ±â ÀÚ½Å)¿¡ÀÇ °Å¸®
±×¸®°í µ¥ÀÌÅÍ ÆÄÀÏÀ» ¾´´Ù. ´ÙÀ½¿¡, ¿ë·Ê ÇÁ·Î±×·¥Àº
¡¡¡¡¡¡apsp-test¡¡µ¥ÀÌÅÍ ÆÄÀÏ
±×¸®°í ½ÇÇàÇϸé, °¢ ½Ã°£ÀÇ ÃÖ´Ü °Å¸®°¡ Ç¥½ÃµÈ´Ù.

ÇÁ·Î±×·¥(apsp.c )
void apsp(int *shortest, int *distance, int numOfCity){
    int  i, j, k;
    int  *s, *d;
    int  x;
    
    s = shortest;
    d = distance;
    for (i = 0; i < numOfCity; i++)
        for (j = 0; j < numOfCity; j++) {
            *s++ = (j ! = i) ?  *d : 0;
            d++;
        }

    for (k = 0; k < numOfCity; k++) {
        s = shortest;
        for (i = 0; i < numOfCity; i++)
            for (j = 0; j < numOfCity; j++) {
                if (*s > (x = *(shortest + i*numOfCity + k) 
                            + *(shortest + k*numOfCity + j)))
                    *s = x;
                s++;
            }
    }
}
¼³¸í
º»ÇÁ·Î±×·¥¿¡´Â Floyd ¹æ¹ýÀ» »ç¿ëÇÏ°í ÀÖ´Ù. ½ÇÇà ½Ã°£Àº ½Ã¼öÀÇ 3 ½Â¿À´õÀÌ´Ù.

½Ã ´ë½Å¿¡ ¿ªÀ» »ý°¢ÇØ °Å¸® ´ë½Å¿¡ Àüö´ë¸¦ »ý°¢Çϸé(ÀÚ), ÀÌ ¹®Á¦´Â ¿ª¿¡¼­ ¿ª±îÁöÀÇ ÃÖÀú ȯ½Â Àüö ¿îÀÓÀ» ¿ä±¸ÇÏ´Â ¹®Á¦°¡ µÈ´Ù. µû¶ó¼­, ÀÀ¿ë¹üÀ§´Â ½Ç·Î ³Ð´Ù. ÃÖ±ÙÀÇ Ä«³»ºñ°ÔÀ̼ǵµ ±× ÀÏ·ÊÀÏ °ÍÀÌ´Ù.

°ü·Ã ÇÔ¼ö