diff --git a/output/paralel_3000.txt b/output/paralel_3000.txt
index 5ee3756e8ae9deecc00c76a1b3fe511814bf763c..6c0ca506bd231767a1b5b8d5ca8b8f3a28d84c0f 100644
--- a/output/paralel_3000.txt
+++ b/output/paralel_3000.txt
@@ -1,5 +1,6 @@
 
-0 4 1 3 
-4 0 3 1 
-1 3 0 2 
-3 1 2 0 
+0 2 1 2 1 
+2 0 3 2 1 
+1 3 0 3 2 
+2 2 3 0 1 
+1 1 2 1 0 
diff --git a/output/paralel_other.txt b/output/paralel_other.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6c0ca506bd231767a1b5b8d5ca8b8f3a28d84c0f
--- /dev/null
+++ b/output/paralel_other.txt
@@ -0,0 +1,6 @@
+
+0 2 1 2 1 
+2 0 3 2 1 
+1 3 0 3 2 
+2 2 3 0 1 
+1 1 2 1 0 
diff --git a/src/djikstra_paralel b/src/djikstra_paralel
index 225168379c4939150686da271b3e25fc964d79f3..43e73dbf217db82995522d5e69bc3a361c091e6e 100755
Binary files a/src/djikstra_paralel and b/src/djikstra_paralel differ
diff --git a/src/djikstra_paralel.c b/src/djikstra_paralel.c
index 768435277ba71ec45a55d94cdcac4d0ad8c59643..ff51b431165d2893bbcc8399bb4a659a6d66e859 100644
--- a/src/djikstra_paralel.c
+++ b/src/djikstra_paralel.c
@@ -74,12 +74,14 @@ void printArray(unsigned long long *arr, int V){
     else if(V == 1000){
         fp = fopen("../output/paralel_1000.txt", "w+");
     }
-    else {
+    else if(V == 3000){
         fp = fopen("../output/paralel_3000.txt", "w+");
     }
+    else {
+        fp = fopen("../output/paralel_other.txt", "w+");
+    }
 
     for(int i = 0; i < V*V; i++){
-        // printf("%d", i);
         if(i % V == 0){
             fprintf(fp, "\n");
             // printf("\n");
@@ -92,6 +94,16 @@ void printArray(unsigned long long *arr, int V){
     fclose(fp);
 }
 
+void printArrayTerminal(unsigned long long *arr, int V){
+    for(int i = 0; i < V*V; i++){
+        if(i % V == 0){
+            printf("\n");
+        }
+        printf("%lld ", arr[i]);
+    }
+    printf("\n");
+}
+
 int minDistance(unsigned long long dist[], bool sptSet[], int V){ 
     int min = INT_MAX, min_index;
 
@@ -139,14 +151,27 @@ int main(int argc, char** argv) {
     }
     generateRandomArray(arr, num_of_node);
 
+
+    unsigned long long **listTempArray;
+    listTempArray = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*));
+    for(int j=0;j<num_of_node;j++){ 
+        listTempArray[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long));
+    }
+
     int process_per_host;
     process_per_host = num_of_node / num_of_processors;
 
     unsigned long long* recv_data;
     recv_data = (unsigned long long *)malloc(((num_of_node*process_per_host*num_of_processors)+num_of_processors)*sizeof(unsigned long long));
 
-    unsigned long long* resultArray;
-    resultArray = (unsigned long long *)malloc(((process_per_host*num_of_node)+1)*sizeof(unsigned long long));
+    // unsigned long long* resultArray;
+    // resultArray = (unsigned long long *)malloc(((process_per_host*num_of_node)+1)*sizeof(unsigned long long));
+
+    unsigned long long **listResultArray;
+    listResultArray = (unsigned long long **)malloc(num_of_processors*sizeof(unsigned long long*));
+    for(int j=0;j<num_of_node;j++){ 
+        listResultArray[j]=(unsigned long long*)malloc((num_of_node*process_per_host+1)*sizeof(unsigned long long));
+    }
         
     #pragma omp parallel num_threads(num_of_processors)
     {
@@ -171,28 +196,28 @@ int main(int argc, char** argv) {
         unsigned long long* tempArray;
         tempArray = (unsigned long long *)malloc(num_of_node*sizeof(unsigned long long));
         
-        // free(tempArray);
-        // INSERT FLAG
+
+        // #pragma omp barrier
+        int count = 0;
+        for (int source=process_per_host*world_rank ; source < (process_per_host*world_rank + process_per_host) ; source++){
+            // printf("\nprocess, rank %d %d\n", process_per_host, world_rank);
+            dijkstra(arr, source, num_of_node, listTempArray[source]);
+            for(int y=0; y<num_of_node;y++){
+                // resultArray[(count*num_of_node) + y] = listTempArray[source][y];
+                listResultArray[world_rank][(count*num_of_node) + y] = listTempArray[source][y];
+            }
+            count++;
+        }
         // resultArray[num_of_node * process_per_host] = world_rank;
-    // }
+        listResultArray[world_rank][num_of_node * process_per_host] = world_rank;
         #pragma omp barrier
         #pragma omp critical
         {
             printf("%d critical\n",world_rank);
-
-            int count = 0;
-            for (int source=process_per_host*world_rank ; source < (process_per_host*world_rank + process_per_host) ; source++){
-                // printf("\nprocess, rank %d %d\n", process_per_host, world_rank);
-                dijkstra(arr, source, num_of_node, tempArray);
-                for(int y=0; y<num_of_node;y++){
-                    resultArray[(count*num_of_node) + y] = tempArray[y];
-                }
-                count++;
-            }
-            resultArray[num_of_node * process_per_host] = world_rank;
-
             for(int i=0;i<process_per_host * num_of_node + 1;i++){
-                recv_data[world_rank*(1+process_per_host*num_of_node) +i] = resultArray[i];
+                // recv_data[world_rank*(1+process_per_host*num_of_node) +i] = resultArray[i];
+                recv_data[world_rank*(1+process_per_host*num_of_node) +i] = listResultArray[world_rank][i];
+
             }
 
             // Flag
@@ -238,7 +263,7 @@ int main(int argc, char** argv) {
 
     int sisa_source;
     sisa_source = num_of_node % (process_per_host * num_of_processors);
-    printf("sisa : %d\n",sisa_source);
+    printf("\nsisa : %d\n",sisa_source);
     if(num_of_node % num_of_processors != 0){
         unsigned long long* tempArray;
         tempArray = (unsigned long long *)malloc((num_of_node)*sizeof(unsigned long long));
@@ -272,7 +297,7 @@ int main(int argc, char** argv) {
     
     // if(world_rank == 0){
         // printf("Time taken %f microsecond\n", dijkstra_time) * 1000000;
-    printArray(hasilAkhir, num_of_node);
+    printArrayTerminal(hasilAkhir, num_of_node);
 
     // }
     // FREE