Orbiter 2022
Combinatorial Objects
union_find.cpp
Go to the documentation of this file.
1// union_find.cpp
2//
3// Anton Betten
4// February 2, 2010
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace data_structures_groups {
15
16
18{
19 A = NULL;
20 prev = NULL;
21}
22
24{
25 freeself();
26}
27
29{
30 if (prev) {
32 }
33 null();
34}
35
37{
38 prev = NULL;
39}
40
41void union_find::init(actions::action *A, int verbose_level)
42{
43 int f_v = (verbose_level >= 1);
44 int i;
45
46 if (f_v) {
47 cout << "union_find::init action=" << A->label << endl;
48 }
49 freeself();
51 prev = NEW_int(A->degree);
52 for (i = 0; i < A->degree; i++) {
53 prev[i] = i;
54 }
55}
56
58{
59 int j;
60
61 while ((j = prev[i]) != i) {
62 i = j;
63 }
64 return i;
65}
66
68{
69 int i, nb;
70
71 nb = 0;
72 for (i = 0; i < A->degree; i++) {
73 if (prev[i] == i)
74 nb++;
75 }
76 return nb;
77
78}
79
81{
82 int i, nb;
83
84 nb = 0;
85 for (i = i0; i < A->degree; i++) {
86 if (prev[i] == i)
87 nb++;
88 }
89 return nb;
90
91}
92
93void union_find::do_union(int a, int b)
94{
95 int A, B;
96
97 A = ancestor(a);
98 B = ancestor(b);
99 if (A == B)
100 return;
101 if (A < B) {
102 prev[a] = A;
103 prev[b] = A;
104 }
105 else {
106 prev[a] = B;
107 prev[b] = B;
108 }
109}
110
112{
113 int i, j;
114
115 cout << "i : ancestor(i) : prev[i]" << endl;
116 for (i = 0; i < A->degree; i++) {
117 j = ancestor(i);
118 cout << setw(4) << i << " : " << setw(4)
119 << j << " : " << setw(4) << i << endl;
120 }
121}
122
123void union_find::add_generators(vector_ge *gens, int verbose_level)
124{
125 int f_v = (verbose_level >= 1);
126 int f_vv = (verbose_level >= 2);
127 int i;
128
129 if (f_v) {
130 cout << "union_find::add_generators" << endl;
131 }
132 if (f_vv) {
133 cout << "union_find::add_generators before:" << endl;
134 print();
135 }
136 for (i = 0; i < gens->len; i++) {
137 if (f_vv) {
138 cout << "union_find::add_generators "
139 "adding generator " << i << endl;
140 }
141 add_generator(gens->ith(i), verbose_level - 2);
142 }
143 if (f_vv) {
144 cout << "union_find::add_generators after:" << endl;
145 print();
146 }
147 if (f_v) {
148 cout << "union_find::add_generators done" << endl;
149 }
150}
151
152void union_find::add_generator(int *Elt, int verbose_level)
153{
154 int f_v = (verbose_level >= 1);
155 int f_vv = (verbose_level >= 2);
156 //int f_vvv = (verbose_level >= 3);
157 int *f_seen;
158 int i, i0, j, k;
159 int cnt = 0;
160
161 if (f_v) {
162 cout << "union_find::add_generator" << endl;
163 }
164 if (f_vv) {
165 A->print_quick(cout, Elt);
166 cout << "as permutation of degree "
167 << A->degree << " (skipped)" << endl;
168 //A->print_as_permutation(cout, Elt);
169 }
170 if (f_vv) {
171 cout << "union_find::add_generator degree=" << A->degree << endl;
172 print();
173 }
174 f_seen = NEW_int(A->degree);
175 for (i = 0; i < A->degree; i++) {
176 f_seen[i] = FALSE;
177 }
178
179 for (i = 0; i < A->degree; i++) {
180 if (f_seen[i])
181 continue;
182 i0 = i;
183 f_seen[i0] = TRUE;
184 j = i0;
185
186 if (f_vv) {
187 cout << "union_find::add_generator i0=" << i0 << endl;
188 //print();
189 }
190
191 while (TRUE) {
192 cnt++;
193 if (cnt > A->degree) {
194 cout << "union_find::add_generator "
195 "too many iterations" << endl;
196 exit(1);
197 }
198 k = A->element_image_of(j, Elt, 0);
199 if (f_vv) {
200 cout << "union_find::add_generator "
201 "i0=" << i0 << " j=" << j << " k=" << k << endl;
202 }
203 if (k == i0)
204 break;
205 f_seen[k] = TRUE;
206 do_union(i0, k);
207 j = k;
208 }
209 }
210 FREE_int(f_seen);
211 if (f_vv) {
212 cout << "union_find::add_generator after:" << endl;
213 print();
214 }
215 if (f_v) {
216 cout << "union_find::add_generator done" << endl;
217 }
218}
219
220
221
222}}}
223
224
a permutation group in a fixed action.
Definition: actions.h:99
void print_quick(std::ostream &ost, void *elt)
Definition: action_cb.cpp:137
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void init(actions::action *A, int verbose_level)
Definition: union_find.cpp:41
void add_generators(vector_ge *gens, int verbose_level)
Definition: union_find.cpp:123
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects