This commit is contained in:
Слободан Јелић 2024-12-24 16:23:07 +01:00
parent d2b2c24a9e
commit b6150ab95c
6 changed files with 624 additions and 2 deletions

View File

@ -1,5 +1,6 @@
{ {
"files.associations": { "files.associations": {
"random_graph.h": "c" "random_graph.h": "c",
"random_groups.h": "c"
} }
} }

501
example1.txt Normal file
View File

@ -0,0 +1,501 @@
Generated graph edges:
Edge 0 -> 2
Edge 0 -> 3
Edge 0 -> 7
Edge 0 -> 11
Edge 0 -> 16
Edge 0 -> 17
Edge 0 -> 25
Edge 0 -> 28
Edge 0 -> 29
Edge 0 -> 30
Edge 0 -> 32
Edge 0 -> 33
Edge 0 -> 34
Edge 0 -> 37
Edge 0 -> 42
Edge 0 -> 43
Edge 0 -> 52
Edge 0 -> 59
Edge 1 -> 5
Edge 1 -> 6
Edge 1 -> 11
Edge 1 -> 13
Edge 1 -> 18
Edge 1 -> 20
Edge 1 -> 23
Edge 1 -> 29
Edge 1 -> 35
Edge 1 -> 36
Edge 1 -> 45
Edge 1 -> 53
Edge 1 -> 54
Edge 1 -> 57
Edge 1 -> 58
Edge 1 -> 59
Edge 2 -> 3
Edge 2 -> 8
Edge 2 -> 11
Edge 2 -> 13
Edge 2 -> 16
Edge 2 -> 26
Edge 2 -> 27
Edge 2 -> 29
Edge 2 -> 30
Edge 2 -> 31
Edge 2 -> 32
Edge 2 -> 36
Edge 2 -> 41
Edge 2 -> 43
Edge 2 -> 45
Edge 2 -> 46
Edge 2 -> 48
Edge 2 -> 50
Edge 2 -> 52
Edge 3 -> 6
Edge 3 -> 18
Edge 3 -> 19
Edge 3 -> 21
Edge 3 -> 23
Edge 3 -> 25
Edge 3 -> 28
Edge 3 -> 38
Edge 3 -> 39
Edge 3 -> 41
Edge 3 -> 42
Edge 3 -> 43
Edge 3 -> 54
Edge 3 -> 57
Edge 4 -> 5
Edge 4 -> 7
Edge 4 -> 8
Edge 4 -> 12
Edge 4 -> 13
Edge 4 -> 14
Edge 4 -> 16
Edge 4 -> 17
Edge 4 -> 21
Edge 4 -> 25
Edge 4 -> 30
Edge 4 -> 33
Edge 4 -> 35
Edge 4 -> 42
Edge 4 -> 43
Edge 4 -> 45
Edge 4 -> 48
Edge 4 -> 51
Edge 4 -> 54
Edge 4 -> 59
Edge 5 -> 10
Edge 5 -> 12
Edge 5 -> 13
Edge 5 -> 16
Edge 5 -> 17
Edge 5 -> 30
Edge 5 -> 36
Edge 5 -> 43
Edge 5 -> 47
Edge 5 -> 48
Edge 5 -> 49
Edge 5 -> 51
Edge 5 -> 54
Edge 5 -> 59
Edge 6 -> 7
Edge 6 -> 8
Edge 6 -> 9
Edge 6 -> 11
Edge 6 -> 14
Edge 6 -> 17
Edge 6 -> 20
Edge 6 -> 21
Edge 6 -> 34
Edge 6 -> 35
Edge 6 -> 37
Edge 6 -> 41
Edge 6 -> 51
Edge 6 -> 54
Edge 6 -> 56
Edge 6 -> 57
Edge 6 -> 59
Edge 7 -> 9
Edge 7 -> 13
Edge 7 -> 14
Edge 7 -> 16
Edge 7 -> 30
Edge 7 -> 35
Edge 7 -> 39
Edge 7 -> 40
Edge 7 -> 43
Edge 7 -> 46
Edge 7 -> 47
Edge 7 -> 48
Edge 7 -> 49
Edge 8 -> 9
Edge 8 -> 10
Edge 8 -> 17
Edge 8 -> 20
Edge 8 -> 24
Edge 8 -> 27
Edge 8 -> 30
Edge 8 -> 32
Edge 8 -> 33
Edge 8 -> 34
Edge 8 -> 37
Edge 8 -> 40
Edge 8 -> 42
Edge 8 -> 43
Edge 8 -> 45
Edge 8 -> 49
Edge 8 -> 52
Edge 8 -> 57
Edge 8 -> 58
Edge 9 -> 10
Edge 9 -> 11
Edge 9 -> 16
Edge 9 -> 20
Edge 9 -> 22
Edge 9 -> 23
Edge 9 -> 24
Edge 9 -> 31
Edge 9 -> 34
Edge 9 -> 35
Edge 9 -> 38
Edge 9 -> 40
Edge 9 -> 41
Edge 9 -> 44
Edge 9 -> 48
Edge 9 -> 49
Edge 9 -> 52
Edge 10 -> 16
Edge 10 -> 19
Edge 10 -> 22
Edge 10 -> 23
Edge 10 -> 25
Edge 10 -> 28
Edge 10 -> 30
Edge 10 -> 32
Edge 10 -> 41
Edge 10 -> 43
Edge 10 -> 46
Edge 10 -> 50
Edge 10 -> 51
Edge 10 -> 52
Edge 10 -> 57
Edge 11 -> 16
Edge 11 -> 17
Edge 11 -> 18
Edge 11 -> 20
Edge 11 -> 25
Edge 11 -> 29
Edge 11 -> 33
Edge 11 -> 37
Edge 11 -> 42
Edge 11 -> 47
Edge 11 -> 48
Edge 12 -> 13
Edge 12 -> 18
Edge 12 -> 19
Edge 12 -> 21
Edge 12 -> 27
Edge 12 -> 31
Edge 12 -> 32
Edge 12 -> 33
Edge 12 -> 35
Edge 12 -> 44
Edge 12 -> 46
Edge 12 -> 49
Edge 12 -> 53
Edge 12 -> 58
Edge 12 -> 59
Edge 13 -> 19
Edge 13 -> 32
Edge 13 -> 33
Edge 13 -> 43
Edge 13 -> 45
Edge 13 -> 49
Edge 13 -> 50
Edge 13 -> 55
Edge 14 -> 17
Edge 14 -> 18
Edge 14 -> 19
Edge 14 -> 20
Edge 14 -> 27
Edge 14 -> 28
Edge 14 -> 34
Edge 14 -> 35
Edge 14 -> 38
Edge 14 -> 43
Edge 14 -> 46
Edge 15 -> 20
Edge 15 -> 25
Edge 15 -> 28
Edge 15 -> 29
Edge 15 -> 31
Edge 15 -> 37
Edge 15 -> 38
Edge 15 -> 40
Edge 15 -> 41
Edge 15 -> 47
Edge 15 -> 50
Edge 15 -> 53
Edge 16 -> 26
Edge 16 -> 31
Edge 16 -> 33
Edge 16 -> 38
Edge 16 -> 39
Edge 16 -> 42
Edge 16 -> 44
Edge 16 -> 47
Edge 16 -> 48
Edge 16 -> 50
Edge 16 -> 51
Edge 16 -> 57
Edge 17 -> 18
Edge 17 -> 22
Edge 17 -> 28
Edge 17 -> 29
Edge 17 -> 36
Edge 17 -> 39
Edge 17 -> 40
Edge 17 -> 44
Edge 17 -> 46
Edge 17 -> 48
Edge 17 -> 49
Edge 17 -> 55
Edge 17 -> 56
Edge 18 -> 20
Edge 18 -> 31
Edge 18 -> 33
Edge 18 -> 36
Edge 18 -> 37
Edge 18 -> 38
Edge 18 -> 39
Edge 18 -> 47
Edge 18 -> 48
Edge 18 -> 58
Edge 19 -> 21
Edge 19 -> 22
Edge 19 -> 26
Edge 19 -> 28
Edge 19 -> 33
Edge 19 -> 35
Edge 19 -> 36
Edge 19 -> 42
Edge 19 -> 43
Edge 19 -> 44
Edge 19 -> 47
Edge 19 -> 53
Edge 19 -> 54
Edge 20 -> 23
Edge 20 -> 25
Edge 20 -> 27
Edge 20 -> 32
Edge 20 -> 35
Edge 20 -> 38
Edge 20 -> 40
Edge 20 -> 44
Edge 20 -> 51
Edge 20 -> 58
Edge 21 -> 25
Edge 21 -> 30
Edge 21 -> 33
Edge 21 -> 38
Edge 21 -> 39
Edge 21 -> 51
Edge 21 -> 52
Edge 21 -> 55
Edge 21 -> 56
Edge 21 -> 57
Edge 21 -> 58
Edge 22 -> 50
Edge 22 -> 51
Edge 22 -> 54
Edge 23 -> 25
Edge 23 -> 27
Edge 23 -> 34
Edge 23 -> 36
Edge 23 -> 47
Edge 23 -> 48
Edge 23 -> 51
Edge 23 -> 54
Edge 23 -> 55
Edge 23 -> 56
Edge 23 -> 59
Edge 24 -> 26
Edge 24 -> 27
Edge 24 -> 32
Edge 24 -> 33
Edge 24 -> 41
Edge 24 -> 45
Edge 24 -> 47
Edge 24 -> 48
Edge 24 -> 49
Edge 24 -> 52
Edge 24 -> 53
Edge 24 -> 58
Edge 25 -> 26
Edge 25 -> 31
Edge 25 -> 34
Edge 25 -> 36
Edge 25 -> 37
Edge 25 -> 39
Edge 25 -> 48
Edge 25 -> 53
Edge 25 -> 54
Edge 25 -> 55
Edge 25 -> 57
Edge 26 -> 33
Edge 26 -> 39
Edge 26 -> 41
Edge 26 -> 43
Edge 26 -> 47
Edge 26 -> 50
Edge 27 -> 29
Edge 27 -> 30
Edge 27 -> 31
Edge 27 -> 32
Edge 27 -> 38
Edge 27 -> 39
Edge 27 -> 43
Edge 27 -> 44
Edge 27 -> 46
Edge 27 -> 51
Edge 27 -> 55
Edge 27 -> 59
Edge 28 -> 29
Edge 28 -> 30
Edge 28 -> 31
Edge 28 -> 36
Edge 28 -> 44
Edge 28 -> 45
Edge 28 -> 58
Edge 29 -> 32
Edge 29 -> 34
Edge 29 -> 41
Edge 29 -> 42
Edge 29 -> 45
Edge 29 -> 47
Edge 29 -> 51
Edge 29 -> 52
Edge 29 -> 59
Edge 30 -> 31
Edge 30 -> 38
Edge 30 -> 43
Edge 30 -> 44
Edge 30 -> 52
Edge 30 -> 57
Edge 31 -> 35
Edge 31 -> 39
Edge 31 -> 44
Edge 31 -> 45
Edge 31 -> 51
Edge 31 -> 58
Edge 31 -> 59
Edge 32 -> 34
Edge 32 -> 35
Edge 32 -> 36
Edge 32 -> 42
Edge 32 -> 52
Edge 32 -> 55
Edge 33 -> 34
Edge 33 -> 35
Edge 33 -> 37
Edge 33 -> 41
Edge 33 -> 53
Edge 33 -> 55
Edge 34 -> 35
Edge 34 -> 36
Edge 34 -> 37
Edge 34 -> 38
Edge 34 -> 43
Edge 34 -> 59
Edge 35 -> 36
Edge 35 -> 37
Edge 35 -> 39
Edge 35 -> 41
Edge 35 -> 47
Edge 35 -> 51
Edge 35 -> 52
Edge 35 -> 56
Edge 36 -> 39
Edge 36 -> 43
Edge 36 -> 45
Edge 36 -> 47
Edge 36 -> 52
Edge 36 -> 53
Edge 36 -> 55
Edge 36 -> 59
Edge 37 -> 39
Edge 37 -> 44
Edge 37 -> 48
Edge 37 -> 51
Edge 37 -> 56
Edge 37 -> 57
Edge 38 -> 40
Edge 38 -> 43
Edge 38 -> 46
Edge 38 -> 56
Edge 38 -> 58
Edge 39 -> 40
Edge 39 -> 46
Edge 39 -> 49
Edge 39 -> 51
Edge 39 -> 52
Edge 39 -> 55
Edge 39 -> 57
Edge 40 -> 47
Edge 40 -> 48
Edge 40 -> 52
Edge 40 -> 54
Edge 41 -> 50
Edge 41 -> 52
Edge 41 -> 57
Edge 41 -> 58
Edge 42 -> 46
Edge 42 -> 48
Edge 42 -> 56
Edge 42 -> 59
Edge 43 -> 48
Edge 43 -> 53
Edge 43 -> 54
Edge 43 -> 59
Edge 44 -> 47
Edge 44 -> 51
Edge 44 -> 52
Edge 44 -> 54
Edge 44 -> 55
Edge 45 -> 48
Edge 45 -> 49
Edge 45 -> 51
Edge 45 -> 52
Edge 45 -> 54
Edge 45 -> 57
Edge 45 -> 58
Edge 46 -> 47
Edge 46 -> 50
Edge 46 -> 54
Edge 46 -> 55
Edge 47 -> 48
Edge 47 -> 52
Edge 47 -> 59
Edge 48 -> 52
Edge 48 -> 53
Edge 48 -> 56
Edge 48 -> 58
Edge 49 -> 53
Edge 49 -> 54
Edge 49 -> 59
Edge 50 -> 52
Edge 50 -> 53
Edge 50 -> 57
Edge 50 -> 59
Edge 51 -> 54
Edge 51 -> 58
Edge 52 -> 54
Edge 52 -> 55
Edge 52 -> 59
Edge 54 -> 57
Edge 54 -> 58
Edge 56 -> 57
Edge 56 -> 58
Edge 57 -> 58

View File

@ -12,6 +12,7 @@ typedef struct Edge {
} Edge; } Edge;
// Function prototypes // Function prototypes
int cmpInt(const void *a, const void *b);
unsigned int uv2index(unsigned int u, unsigned int v, unsigned int n); unsigned int uv2index(unsigned int u, unsigned int v, unsigned int n);
unsigned int min(unsigned int u, unsigned int v); unsigned int min(unsigned int u, unsigned int v);
unsigned int max(unsigned int u, unsigned int v); unsigned int max(unsigned int u, unsigned int v);

16
include/random_groups.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef RANDOM_GROUPS_H
#define RANDOM_GROUPS_H
#include <stdlib.h>
#include <stdio.h>
// Struct for representing groups
typedef struct {
unsigned int *group; // Pointer to an array of group members
unsigned int size; // Number of members in the group
} Group;
// Function to generate random groups
void generate_random_groups(unsigned int n, unsigned int k, Group **groups);
#endif // RANDOM_GROUPS_H

View File

@ -1,9 +1,10 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "random_graph.h" #include "random_graph.h"
#include "random_groups.h"
int main() { int main() {
unsigned int n = 5000, m = 10000, seed = 0; unsigned int n = 20, m = 80, k = 4, seed = 5;
Edge *edges = malloc(m * sizeof(Edge)); Edge *edges = malloc(m * sizeof(Edge));
if (!edges) { if (!edges) {
fprintf(stderr, "Error: Memory allocation of EDGE array: edges FAILED.\n"); fprintf(stderr, "Error: Memory allocation of EDGE array: edges FAILED.\n");
@ -17,6 +18,21 @@ int main() {
printf("Edge %d -> %d\n", edges[i].src, edges[i].dest); printf("Edge %d -> %d\n", edges[i].src, edges[i].dest);
} }
Group *groups;
generate_random_groups(n, k, &groups);
// Print groups
printf("Random groups:\n");
for (unsigned int i = 0; i < k; i++) {
printf("Group %u: ", i);
for (unsigned int j = 0; j < groups[i].size; j++) {
printf("%u ", groups[i].group[j]);
}
printf("\n");
free(groups[i].group); // Free each group's array
}
free(groups); // Free the groups array
free(edges); free(edges);
return 0; return 0;
} }

87
src/random_groups.c Normal file
View File

@ -0,0 +1,87 @@
#include "random_groups.h"
#include "random_graph.h"
// Helper function to shuffle an array
void shuffle(unsigned int *array, unsigned int size) {
for (unsigned int i = size - 1; i > 0; i--) {
unsigned int j = rand() % (i + 1);
unsigned int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
void generate_random_groups(unsigned int n, unsigned int k, Group **groups_out) {
if (k > n) {
fprintf(stderr, "Error: Number of groups (k) cannot exceed the number of vertices (n).\n");
exit(EXIT_FAILURE);
}
// Allocate memory for array N (vertices) and initialize
unsigned int *N = (unsigned int *)malloc(n * sizeof(unsigned int));
if (!N) {
fprintf(stderr, "Error: Memory allocation failed for array N.\n");
exit(EXIT_FAILURE);
}
for (unsigned int i = 0; i < n; i++) {
N[i] = i;
}
// Allocate memory for groups
Group *groups = (Group *)malloc(k * sizeof(Group));
if (!groups) {
fprintf(stderr, "Error: Memory allocation failed for groups.\n");
free(N);
exit(EXIT_FAILURE);
}
for (unsigned int i = 0; i < k; i++) {
groups[i].group = (unsigned int *)malloc(n * sizeof(unsigned int));
groups[i].size = 0;
if (!groups[i].group) {
fprintf(stderr, "Error: Memory allocation failed for group %u.\n", i);
for (unsigned int j = 0; j < i; j++) {
free(groups[j].group);
}
free(groups);
free(N);
exit(EXIT_FAILURE);
}
}
// Generate a random float f in the range (0, 0.5)
float f;
do {
f = (float)rand() / RAND_MAX;
} while (f <= 0.0 || f >= 0.5);
unsigned int offset = (unsigned int)(f * n);
// Shuffle the array N
shuffle(N, n);
// Distribute elements to the first part of each group
for (unsigned int i = 0; i < k; i++) {
groups[i].group[groups[i].size++] = N[offset + i];
}
// Distribute remaining elements to groups
for (unsigned int i = 0; i < k; i++) {
unsigned int start = offset + k;
unsigned int end = offset + k + (n - offset) / k - 1;
shuffle(N + start, end - start + 1);
for (unsigned int j = start; j <= end; j++) {
groups[i].group[groups[i].size++] = N[j];
}
}
// Sort each group
for (unsigned int i = 0; i < k; i++) {
qsort(groups[i].group, groups[i].size, sizeof(unsigned int), cmpInt);
}
// Clean up
free(N);
*groups_out = groups;
}