int UFFind(int *ufRoot, int a)
{
if (ufRoot[a] < 0) {
return a;
}
ufRoot[a] = UFFind(ufRoot, ufRoot[a]); // 路径压缩
return ufRoot[a];
}
void UFUnion(int *ufRoot, int a, int b)
{
int rtA = UFFind(ufRoot, a);
int rtB = UFFind(ufRoot, b);
if (rtA == rtB) {
return;
}
if (ufRoot[rtA] < ufRoot[rtB]) { // 按秩合并
ufRoot[rtB] = rtA;
} else if (ufRoot[rtA] > ufRoot[rtB]) {
ufRoot[rtA] = rtB;
} else {
ufRoot[rtB] = rtA; // 高度相同, B 挂到 A 上
ufRoot[rtA]--; // 更新 A 的高度
}
}
int countComponents(int n, int** edges, int edgesSize, int* edgesColSize){
int col = edgesColSize[0];
int *ufRoot = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
ufRoot[i] = -1; // 高度全部初始化为 -1
}
for (int i = 0; i < edgesSize; i++) {
UFUnion(ufRoot, edges[i][0], edges[i][1]);
}
int relt = 0;
for (int i = 0; i < n; i++) {
if (ufRoot[i] < 0) {
relt++;
}
}
return relt;
}
并查集模板
最新推荐文章于 2022-05-15 22:06:06 发布