接続性問題の改善アルゴリズム

17042 ワード

前の「接続性問題」ではこの問題を紹介しましたが、この章では上記の問題に対する改善を与え、コードの中で原理についてコメントしました.
加重高速合成アルゴリズム
 1 /**

 2   * @file weightedquickunion.c

 3   * @brief         

 4   *              ,                 ,            ,

 5   *                       。               ,      

 6   *        sz    id[i]==i           ,                

 7   *             ,           。

 8   * @date  2015-01-15

 9   */

10 #include <stdio.h>

11 #define N 1000

12 

13 int main(void)

14 {

15     int i, j, p, q;

16     int id[N], sz[N];

17     //           

18     for (i = 0; i < N; i++)

19     {

20         id[i] = i;

21         sz[i] = 1;

22     }

23     //       

24     while (scanf("%d-%d", &p, &q) == 2)

25     {

26         //  p    

27         for (i = p; i != id[i]; i = id[i]);

28         //  q    

29         for (j = q; j != id[j]; j = id[j]);

30         //  p q        ,              

31         if (i == j) continue;

32         //  , p q            

33         if (sz[i] < sz[j])

34         {//q      

35             id[i] = j;     // p       q       

36             sz[j] += sz[i];//q                    p       

37         }

38         else

39         {//p      

40             id[j] = i;     // q       p       

41             sz[i] += sz[j];//p                    q       

42         }

43         printf("New Pair: %d-%d
", p, q); 44 } 45 46 return 0; 47 }
 
パス圧縮アルゴリズム
 1 /**

 2   * @file pathcompression.c

 3   * @brief               

 4   *              ,                 ,            ,

 5   *                       。               ,      

 6   *        sz    id[i]==i           ,                

 7   *             ,           。

 8   * @brief     :        ,              ,         

 9   *            id         。         ,          ,  

10   *              ,              ,                 。

11   * @brief       :                              。

12   * @date  2015-01-15

13   */

14 #include <stdio.h>

15 #define N 1000

16 #if 0

17 #define PATH_COMPRESSION  //    

18 #else

19 #define EQUAL_PATHCOMPRESSION  //      

20 #endif // 0

21 

22 int main(void)

23 {

24     int i, j, p, q, index;

25     int id[N], sz[N];

26     //           

27     for (i = 0; i < N; i++)

28     {

29         id[i] = i;

30         sz[i] = 1;

31     }

32     //       

33     while (scanf("%d-%d", &p, &q) == 2)

34     {

35     #ifdef EQUAL_PATHCOMPRESSION

36         //  p    

37         for (i = p; i != id[i]; i = id[i])

38             id[i] = id[id[i]];

39         //  q    

40         for (j = q; j != id[j]; j = id[j]);

41             id[j] = id[id[j]];

42     #else

43         //  p    

44         for (i = p; i != id[i]; i = id[i]);

45         //  q    

46         for (j = q; j != id[j]; j = id[j]);

47     #endif // EQUAL_PATHCOMPRESSION

48 

49         //  p q        ,              

50         if (i == j) continue;

51         //  , p q            

52         if (sz[i] < sz[j])

53         {//q      

54             id[i] = j;     // p       q       

55             sz[j] += sz[i];//q                    p       

56         #ifdef PATH_COMPRESSION

57             //           

58             for (i = q; i != id[i];)

59             {

60                 index = i;     //       

61                 i = id[i];     //           

62                 id[index] = j; //            

63             }

64         #endif // PATH_COMPRESSION

65         }

66         else

67         {//p      

68             id[j] = i;     // q       p       

69             sz[i] += sz[j];//p                    q       

70         #ifdef PATH_COMPRESSION

71             //           

72             for (j= p; j != id[j];)

73             {

74                 index = j;     //       

75                 j = id[j];     //           

76                 id[index] = i; //            

77             }

78         #endif // PATH_COMPRESSION

79         }

80         printf("New Pair: %d-%d
", p, q); 81 } 82 83 return 0; 84 }