
解题思路: ufs 并查集中
关键:一条边的两个节点的父节点不相同则Union,若相同则说明这两个节点之前已经被Union过即此边为多余边。(请细品)
并查集用了路径压缩和按秩归并提高效率。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct {
int *p;
int size;
} ufs_t;
ufs_t * initUFS(int n)
{
ufs_t *ufs = (ufs_t *) malloc(sizeof(ufs_t));
ufs->p = (int *) malloc(n * sizeof(int));
ufs->size = n;
for (int i = 0; i < n; i++) {
ufs->p[i] = -1;
}
return ufs;
}
void destoryUFS(ufs_t *ufs)
{
if (ufs != NULL&& ufs->p != NULL) {
free(ufs->p);
free(ufs);
}
}
int findUFS(ufs_t *ufs, int x)
{
if (ufs->p[x] < 0) {
return x;
}
return ufs->p[x] = findUFS(ufs, ufs->p[x]);
}
int merge(ufs_t *ufs, int x, int y)
{
int fx = findUFS(ufs, x);
int fy = findUFS(ufs, y);
if (fx == fy) {
return -1;
}
ufs->p[fx] += ufs->p[fy];
ufs->p[fy] = fx;
return 0;
}
int ufs_set_size(ufs_t *ufs, int x)
{
int fx = findUFS(ufs, x);
return abs(ufs->p[fx]);
}
int* findRedundantConnection(int** edges, int edgesSize, int* edgesColSize, int* returnSize)
{
if (edges == NULL || edgesSize <= 0 || *edgesColSize != 2) {
*returnSize = 0;
return NULL;
}
ufs_t *ufs = initUFS(edgesSize + 1);
int i;
for (i = 0; i < edgesSize; i++) {
if (merge(ufs, edges[i][0], edges[i][1]) != 0) {
break;
}
}
destoryUFS(ufs);
int * res = (int *)malloc(*edgesColSize * sizeof(int));
res[0] = edges[i][0];
res[1] = edges[i][1];
*returnSize = 2;
return res;
}
本文介绍了一种使用并查集数据结构解决图形中冗余连接问题的方法。通过路径压缩和按秩归并提高效率,确保每个节点的父节点唯一,避免形成环路。当遇到两个节点的父节点相同时,表明当前边为冗余边。
1223

被折叠的 条评论
为什么被折叠?



