diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b45f82394ef7b42224c17012aa4773c27d96071b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+dist
+.vscode
+
+hosts.dev.txt
+*.o
+.DS_Store
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2ffccfd6ea1c9ffb7262b8281e31c4240a0f8bd
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+
+#include "utils/matrix.h"
+#include "utils/dijkstra.h"
+
+long int *calculate_sub_matrix(long int *matrix, int node_count, int thread_count);
+
+int main(int argc, char *argv[])
+{
+    int thread_count = strtol(argv[1], NULL, 10);
+    char print_dist;
+
+    setvbuf(stdout, NULL, _IONBF, 0);
+    srand(13517003);
+
+    if (argc < 2)
+    {
+        printf("usage: main <num_of_nodes>");
+        exit(-1);
+    }
+
+    int node_count = atoi(argv[2]);
+    long int *adj_matrix = create_adj_matrix(node_count, node_count);
+
+    double start_time = omp_get_wtime();
+    long int *sub_dist = calculate_sub_matrix(adj_matrix, node_count, thread_count);
+    double time = omp_get_wtime() - start_time;
+
+    printf("Elapsed Time : %f\n", time*1000000);
+    printf("Print distances to stdout? [y/N] ");
+    scanf("%c", &print_dist);
+
+    print_matrix_to_file(sub_dist, node_count, node_count, argv[3]);
+    if (print_dist == 'y' || print_dist == 'Y')
+    {
+        print_matrix(sub_dist, node_count, node_count);
+    }
+
+    free(sub_dist);
+    free(adj_matrix);
+}
+
+long int *calculate_sub_matrix(long int *matrix, int node_count, int thread_count)
+{
+    long int *sub_dist = (long int *)malloc(node_count * node_count * sizeof(long int));
+
+    for (int i = 0; i < node_count; i++)
+    {
+        long int *temp_dist = dijkstra(matrix, i, node_count);
+
+        for (int j = 0; j < node_count; j++)
+        {
+            set_el(sub_dist, node_count, j, i, temp_dist[j]);
+        }
+    }
+
+    return sub_dist;
+}
diff --git a/src/utils/dijkstra.c b/src/utils/dijkstra.c
new file mode 100644
index 0000000000000000000000000000000000000000..2949cdce79526fa14785aa56f3dad99631ec5fd9
--- /dev/null
+++ b/src/utils/dijkstra.c
@@ -0,0 +1,54 @@
+#include "dijkstra.h"
+
+long int get_idx_min_dist(long int *dist, short *processed, int len)
+{
+    long int min = LONG_MAX;
+    int idx;
+
+    for (int i = 0; i < len; i++)
+    {
+        if (!processed[i] && dist[i] < min)
+        {
+            idx = i;
+            min = dist[i];
+        }
+    }
+
+    return idx;
+}
+
+long int *dijkstra(long int *adj_matrix, int src, int size)
+{
+    long int *dist = (long int *)malloc(size * sizeof(long int));
+    short processed[size];
+
+    for (int i = 0; i < size; i++)
+    {
+        dist[i] = LONG_MAX;
+        processed[i] = FALSE;
+    }
+
+    dist[src] = 0L;
+
+    for (int j = 0; j < size; j++)
+    {
+        int u = get_idx_min_dist(dist, processed, size);
+        processed[u] = TRUE;
+
+        for (int i = 0; i < size; i++)
+        {
+            if (get_el(adj_matrix, size, i, u) == 0 && u != i)
+            {
+                continue;
+            }
+
+            long int next_dist = dist[u] + get_el(adj_matrix, size, i, u);
+            if (next_dist < dist[i])
+            {
+                dist[i] = next_dist;
+            }
+        }
+    }
+
+    return dist;
+}
\ No newline at end of file
diff --git a/src/utils/dijkstra.h b/src/utils/dijkstra.h
new file mode 100644
index 0000000000000000000000000000000000000000..d143e6b3116b1596989edd62fa1013c881de35c6
--- /dev/null
+++ b/src/utils/dijkstra.h
@@ -0,0 +1,10 @@
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "matrix.h"
+
+#define TRUE 1
+#define FALSE 0
+
+long int *dijkstra(long int *adj_matrix, int src, int size);
diff --git a/src/utils/matrix.c b/src/utils/matrix.c
new file mode 100644
index 0000000000000000000000000000000000000000..3cb4c93f22253ab468a520aff3d9645504c661b2
--- /dev/null
+++ b/src/utils/matrix.c
@@ -0,0 +1,71 @@
+#include "matrix.h"
+
+void print_array(long int *array, int width)
+{
+    for (int i = 0; i < width; i++)
+    {
+        printf("%10ld\t", array[i]);
+    }
+    printf("\n");
+}
+
+void print_matrix(long int *matrix, int width, int height)
+{
+    for (int i = 0; i < height; i++)
+    {
+        for (int j = 0; j < width; j++)
+        {
+            printf("%10ld\t", matrix[i * width + j]);
+        }
+        printf("\n");
+    }
+}
+
+void print_matrix_to_file(long int *matrix, int width, int height, char *filename)
+{
+    FILE *fp;
+
+    fp = fopen(filename, "w+");
+
+    for (int i = 0; i < height; i++)
+    {
+        for (int j = 0; j < width; j++)
+        {
+            fprintf(fp, "%10ld\t", matrix[i * width + j]);
+        }
+        fprintf(fp, "\n");
+    }
+    fclose(fp);
+}
+
+long int *create_adj_matrix(int width, int height)
+{
+    long int *matrix = (long int *)malloc(width * height * sizeof(long int));
+
+    for (int i = 0; i < height; i++)
+    {
+        for (int j = 0; j < width; j++)
+        {
+            if (i == j)
+                matrix[i * width + j] = 0;
+            else if (i < j)
+            {
+                long int temp = (long int)rand();
+                matrix[i * width + j] = temp;
+                matrix[j * width + i] = temp;
+            }
+        }
+    }
+
+    return matrix;
+}
+
+long int get_el(long int *matrix, int width, int x, int y)
+{
+    return matrix[y * width + x];
+}
+
+void set_el(long int *matrix, int width, int x, int y, long int value)
+{
+    matrix[y * width + x] = value;
+}
diff --git a/src/utils/matrix.h b/src/utils/matrix.h
new file mode 100644
index 0000000000000000000000000000000000000000..c02cbb6bb8e3f47f9e05b3838962cb7f510ad94d
--- /dev/null
+++ b/src/utils/matrix.h
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void print_array(long int *array, int width);
+void print_matrix(long int *matrix, int width, int height);
+void print_matrix_to_file(long int *matrix, int width, int height, char *filename);
+long int get_el(long int *matrix, int width, int x, int y);
+void set_el(long int *matrix, int width, int x, int y, long int value);
+long int *create_adj_matrix(int width, int height);
\ No newline at end of file