mirror of https://github.com/TheAlgorithms/C
fix lgtm error and add basic docs
This commit is contained in:
parent
d1dfde4f89
commit
47958fb003
|
@ -1,46 +1,89 @@
|
||||||
|
/**
|
||||||
|
* @file union_find.c
|
||||||
|
* @brief [Union
|
||||||
|
* find](https://en.wikipedia.org/wiki/Disjoint-set_data_structure) algorithm.
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define MAX_SIZE 1000 /**< maximum number of elements in the set */
|
||||||
|
|
||||||
int p[1000000];
|
/**
|
||||||
int find(int x)
|
* @brief Find index of or value in an array
|
||||||
|
*
|
||||||
|
* @param [in,out] p array to search and update
|
||||||
|
* @param x value to search
|
||||||
|
* @return value at the index `x`
|
||||||
|
*/
|
||||||
|
int find(int *p, int x)
|
||||||
{
|
{
|
||||||
|
if (x >= MAX_SIZE)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Out-of bounds value\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
if (p[x] == x)
|
if (p[x] == x)
|
||||||
{
|
{
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p[x] = find(p[x]);
|
p[x] = find(p, p[x]);
|
||||||
return p[x];
|
return p[x];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Call to function join(int x, int y) to join PARAM x and y
|
|
||||||
void join(int x, int y) { p[find(x)] = find(y); }
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to join
|
||||||
|
* @param [in,out] p array to join in
|
||||||
|
* @param x value or index to join to
|
||||||
|
* @param y value or index to join from
|
||||||
|
*/
|
||||||
|
void join(int *p, int x, int y) { p[find(p, x)] = find(p, y); }
|
||||||
|
|
||||||
|
/** Main function */
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// Have all array indexes that you need to use refrence themselves
|
int union_set[MAX_SIZE];
|
||||||
|
|
||||||
|
// Have all array indexes that you need to use reference themselves
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
p[i] = i;
|
union_set[i] = i;
|
||||||
}
|
}
|
||||||
// p = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
|
// p = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
|
||||||
join(3, 5);
|
|
||||||
|
join(union_set, 3, 5);
|
||||||
|
printf("The array is now: ");
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", union_set[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
// Now 3 and 5 are groupped together, that is find(3) = find(5)
|
// Now 3 and 5 are groupped together, that is find(3) = find(5)
|
||||||
// p = {0, 1, 2, 5, 4, 5, 6, 7, 8, 9}
|
// p = {0, 1, 2, 5, 4, 5, 6, 7, 8, 9}
|
||||||
join(3, 8);
|
|
||||||
|
join(union_set, 3, 8);
|
||||||
|
printf("The array is now: ");
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", union_set[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
// Now 3, 5 and are groupped together, find(3) = find(5) = find(8)
|
// Now 3, 5 and are groupped together, find(3) = find(5) = find(8)
|
||||||
// p = {0, 1, 2, 5, 4, 8, 6, 7, 8, 9}
|
// p = {0, 1, 2, 5, 4, 8, 6, 7, 8, 9}
|
||||||
join(0, 5);
|
join(union_set, 0, 5);
|
||||||
if (find(0) == find(3))
|
if (find(union_set, 0) == find(union_set, 3))
|
||||||
{
|
{
|
||||||
printf("0 and 3 are groupped together\n");
|
printf("0 and 3 are groupped together\n");
|
||||||
}
|
}
|
||||||
printf("The array is now: ");
|
printf("The array is now: ");
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
printf("%d ", p[i]);
|
printf("%d ", union_set[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue