166{
168
169
170 groups.SetSequence(0, 1);
171 for (int i = count - 1; i >= founders; i--)
172 {
173
174 int group0 = i;
175 int group1 = ped[path[i]].father->traverse;
176 int group2 = ped[path[i]].mother->traverse;
177
178
179 while (groups[group0] != group0) group0 = groups[group0];
180 while (groups[group1] != group1) group1 = groups[group1];
181 while (groups[group2] != group2) group2 = groups[group2];
182
183 int group = group1 < group2 ? group1 : group2;
184 if (group0 < group) group = group0;
185
186 groups[group0] = groups[group1] = groups[group2] = group;
187 }
188
189
190 int groupCount = 0;
191 for (int i = 0; i < founders; i++)
192 if (groups[i] == i)
193 groupCount++;
194
195 if (groupMembership == NULL)
196 return groupCount;
197
198
199 for (int i = 1; i < count; i++)
200 groups[i] = groups[groups[i]];
201
202
203 int group = 0;
204 groupMembership->Dimension(count);
205 for (int i = 0; i < count; i++)
206 if (groups[i] == i)
207 (*groupMembership)[i] = ++group;
208 else
209 (*groupMembership)[i] = (*groupMembership)[groups[i]];
210
211#if 0
212
213
214 for (int j = first; j <= last; j++)
215 printf("%s %s %s %s %d %d\n",
216 (const char *) famid, (const char *) ped[j].pid,
217 (const char *) ped[j].fatid, (const char *) ped[j].motid,
218 ped[j].sex, groups[ped[j].traverse]);
219#endif
220
221 return groupCount;
222}