ConnComp.cc
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:3k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // ConnComp.h
  3. // Kari Pulli
  4. // Wed Feb 17 12:03:17 CET 1999
  5. //
  6. // A class for figuring out the connected components
  7. //############################################################
  8. #ifndef _CONNCOMP_H_
  9. #define _CONNCOMP_H_
  10. #include <vector.h>
  11. #include <iostream.h>
  12. #include <iomanip.h>
  13. //#define TEST_CONNCOMP
  14. class ConnComp {
  15. private:
  16.   
  17.   vector<int>   label;
  18.   int           max;
  19.   int           next_group;
  20.   void display(void)
  21.     {
  22.       for (int i=0; i<label.size(); i++) {
  23. cout << setw(3) << i << " : " 
  24.      << setw(3) << label[i] << endl;
  25.       }
  26.     }
  27.   int  get_label(int i) 
  28.     {
  29.       if (label[i] != i) 
  30. label[i] = get_label(label[i]);
  31.       return label[i];
  32.     }
  33. public:
  34.   ConnComp(int size)
  35.     : max(-1), next_group(0), label(size)
  36.     {
  37.       for (int i=0; i<size; i++) label[i] = i;
  38.     }
  39.   ~ConnComp(void) {}
  40.   void collapse(void)
  41.     {
  42.       next_group = 0;
  43.       max = -1;
  44.       for (int i=1; i<label.size(); i++) {
  45. label[i] = label[label[i]];
  46. if (label[i] > max) max = label[i];
  47.       }
  48. #ifdef TEST_CONNCOMP
  49.       display();
  50. #endif
  51.     }  
  52.   
  53.   void connect(int a, int b)
  54.     {
  55.       assert(a >= 0 && b >= 0);
  56.       assert(a < label.size() && b < label.size());
  57.       int la = get_label(a);
  58.       int lb = get_label(b);
  59.       if (la < lb) label[lb] = la;
  60.       else         label[la] = lb;
  61. #ifdef TEST_CONNCOMP
  62.       display();
  63. #endif
  64.     }
  65.   void restart_groups(void)
  66.     {
  67.       next_group = 0;
  68.     }
  69.   
  70.   // fill the vector 'group' with all the elements that belong
  71.   // to the next group
  72.   // return a boolean that's false if all the groups have 
  73.   // been gotten already
  74.   bool get_next_group(vector<int> &group)
  75.     {
  76.       if (next_group == 0)  collapse();
  77.       if (next_group > max) return false;
  78.       group.clear();
  79.       while (next_group != label[next_group])
  80. next_group++;
  81.       for (int i=0; i < label.size(); i++) {
  82.         if (label[i] == next_group)
  83.   group.push_back(i);
  84.       }
  85.       next_group++;
  86.       return true;
  87.     }
  88.   int num_groups (void)
  89.     {
  90.       return max;
  91.     }
  92. };
  93. #endif
  94. #ifdef TEST_CONNCOMP
  95. void
  96. main(void)
  97. {
  98.   ConnComp b(10);
  99.   vector<int> g;
  100.   while (1) {
  101.     cout << "add or collapse or get next group" << endl;
  102.     char txt[256];
  103.     cin >> txt;
  104.     if (txt[0] == 'a') {
  105.       cout << "give two numbers" << endl;
  106.       int a1, a2;
  107.       cin >> a1 >> a2;
  108.       b.connect(a1, a2);
  109.     } else if (txt[0] == 'c') {
  110.       b.collapse();
  111.     } else {
  112.       cout << b.get_next_group(g) << endl;
  113.       cout << g.size() << endl;
  114.       for (int i=0; i<g.size(); i++) {
  115. cout << g[i] << " ";
  116.       }
  117.       cout << endl;
  118.     }
  119.   }
  120. }
  121. #endif