diff --git a/dijsktra-sequential.c b/dijsktra-sequential.c new file mode 100644 index 0000000000000000000000000000000000000000..4f2ad0a64dc10ff2a0079c011d92aa4f8069a5d8 --- /dev/null +++ b/dijsktra-sequential.c @@ -0,0 +1,115 @@ +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <omp.h> + +#define NIM 13517075 +typedef enum { false, true } bool; + +int minDistance(int V, int dist[], bool sptSet[]) { + int min = INT_MAX, min_index = -1; + + for (int v = 0; v < V; v++) + if (sptSet[v] == false && dist[v] <= min) + min = dist[v], min_index = v; + + return min_index; +} + +int printSolution(FILE *file, int V, int dist[]) { + + for (int i = 0; i < V; i++) { + fprintf(file,"%d",dist[i]); + if(i<(V-1)){ + fprintf(file," "); + } + + } + fprintf(file,"\n"); +} + +void dijkstra(int V, int graph[V * V], int dist[V], int src) { + bool sptSet[V]; + + for (int i = 0; i < V; i++) + dist[i] = INT_MAX, sptSet[i] = false; + + dist[src] = 0; + + for (int count = 0; count < V - 1; count++) { + int u = minDistance(V, dist, sptSet); + + if (u == -1) break; + + sptSet[u] = true; + + for (int v = 0; v < V; v++) { + int temp = dist[u] + graph[u * V + v]; + if ( + !sptSet[v] && + temp < dist[v] && + temp > 0 + ) dist[v] = temp; + } + } +} + +void createGraph(int N, int graph[]) { + int value; + srand(NIM); + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + graph[i * N + j] = 0; + } + } + + for (int i = 0; i < N; i++) { + for (int j = i; j < N; j++) { + if (i != j) { + value = rand() % 10000; + graph[i * N + j] = value; + graph[j * N + i] = value; + } + } + } +} + +int main(int argc, char **argv) { + + + FILE *output_file; + double end, start; + + + + if (argc != 2) { + fprintf(stderr, "Usage: number of node required\n"); + exit(1); + } + + int N = atoi(argv[1]); + int* graph = malloc(N * N * sizeof(int)); + + // open file + output_file = fopen("../out/sequential.txt","w+"); + + createGraph(N, graph); + // Time start + start = omp_get_wtime(); + + for (int i = 0; i < N; i++) { + int* globalDist = malloc(N * sizeof(int)); + + dijkstra(N, graph, globalDist, i); + printSolution(output_file,N, globalDist); + free(globalDist); + } + //end + end = omp_get_wtime(); + double time_taken = end-start; + printf("Time elapsed : %f\n", time_taken); + + free(graph); + return 0; +}