graphprogram/graph.c

119 lines
4.1 KiB
C
Raw Normal View History

2024-09-26 14:32:20 +02:00
#include <stdint.h>
2024-10-04 16:46:40 +02:00
#include <stdio.h>
2024-09-26 14:32:20 +02:00
#include <time.h>
#include <stdlib.h>
2024-10-04 17:36:40 +02:00
#include "matrix.h"
2024-09-26 14:32:20 +02:00
2024-10-04 13:05:02 +02:00
void random_adjacency(const uint64_t vertex_count, uint64_t matrix[vertex_count][vertex_count]) {
2024-09-26 14:32:20 +02:00
srand(time(NULL));
2024-10-07 09:03:29 +02:00
for (uint64_t row_index = 0; row_index < vertex_count; row_index++) {
for (uint64_t column_index = 0; column_index < vertex_count; column_index++) {
2024-10-04 17:36:40 +02:00
if (column_index == row_index) {
2024-10-04 01:03:39 +02:00
matrix[row_index][column_index] = 0;
2024-09-26 14:32:20 +02:00
continue;
}
2024-10-07 09:03:29 +02:00
matrix[row_index][column_index] = rand() % 2;
2024-09-26 14:32:20 +02:00
}
}
}
2024-10-04 13:05:02 +02:00
2024-10-04 17:36:40 +02:00
void calculate_distance_matrix(const uint64_t vertex_count, const uint64_t adjacency_matrix[vertex_count][vertex_count], uint64_t distance_matrix[vertex_count][vertex_count]) {
uint64_t power_matrix[vertex_count][vertex_count];
2024-10-07 09:03:29 +02:00
uint64_t temp_power_matrix[vertex_count][vertex_count];
2024-10-04 17:36:40 +02:00
copy(vertex_count, vertex_count, adjacency_matrix, power_matrix);
2024-10-07 09:03:29 +02:00
for (uint64_t row_index = 0; row_index < vertex_count; row_index++) {
for (uint64_t column_index = 0; column_index < vertex_count; column_index++) {
if (row_index == column_index) {
2024-10-04 17:36:40 +02:00
distance_matrix[row_index][column_index] = 0;
} else if (adjacency_matrix[row_index][column_index] == 1) {
distance_matrix[row_index][column_index] = 1;
} else {
distance_matrix[row_index][column_index] = UINT64_MAX;
}
}
}
2024-10-07 09:03:29 +02:00
for(uint64_t k = 2; k <= vertex_count; k++) {
copy(vertex_count, vertex_count, power_matrix, temp_power_matrix);
gemm_basic(vertex_count, vertex_count, adjacency_matrix, vertex_count, vertex_count, temp_power_matrix, power_matrix);
2024-10-04 17:36:40 +02:00
2024-10-07 09:03:29 +02:00
for (uint64_t row_index = 0; row_index < vertex_count; row_index++) {
for (uint64_t column_index = 0; column_index < vertex_count; column_index++) {
2024-10-04 17:36:40 +02:00
if (power_matrix[row_index][column_index] != 0 && distance_matrix[row_index][column_index] == UINT64_MAX) {
distance_matrix[row_index][column_index] = k;
}
}
}
}
}
2024-10-09 01:42:55 +02:00
int get_eccentricities(const uint64_t vertex_count, const uint64_t distance_matrix[vertex_count][vertex_count], uint64_t eccentricities[vertex_count]) {
uint64_t eccentricity;
// set all eccentricities to infinity in case this is a disconnected graph
for (uint64_t index = 0; index < vertex_count; index++) {
eccentricities[index] = UINT64_MAX;
}
for (uint64_t row_index = 0; row_index < vertex_count; row_index++) {
eccentricity = 0;
for (uint64_t column_index = 0; column_index < vertex_count; column_index++) {
if (distance_matrix[row_index][column_index] > eccentricity) {
eccentricity = distance_matrix[row_index][column_index];
}
}
// in case of a disconnected graph
if (eccentricity == 0) {
return 1;
}
eccentricities[row_index] = eccentricity;
}
return 0;
}
uint64_t get_radius(const uint64_t vertex_count, const uint64_t eccentricities[vertex_count]) {
uint64_t radius = UINT64_MAX;
for (uint64_t index = 0; index < vertex_count; index++) {
if (eccentricities[index] < radius) {
radius = eccentricities[index];
}
}
return radius;
}
uint64_t get_diameter(const uint64_t vertex_count, const uint64_t eccentricities[vertex_count]) {
uint64_t diamter = 0;
for (uint64_t index = 0; index < vertex_count; index++) {
// in case of a disconnected graph
if (eccentricities[index] == UINT64_MAX) {
return UINT64_MAX;
}
if (eccentricities[index] > diamter) {
diamter = eccentricities[index];
}
}
return diamter;
2024-10-04 13:05:02 +02:00
}
2024-10-09 01:42:55 +02:00
void get_centre(const uint64_t vertex_count, const uint64_t eccentricities[vertex_count], const uint64_t radius, uint64_t centre[vertex_count]) {
for (uint64_t index = 0; index < vertex_count; index++) {
centre[index] = 0;
}
for (uint64_t index = 0; index < vertex_count; index++) {
if (eccentricities[index] == radius) {
centre[index] = 1;
}
}
}