void kosarajuSCC() {
    memset(visited, false, sizeof visited);
    for(int i = 0; i < N; ++i) if(!visited[i]) dfs1(i);
    transposeGraph();
    memset(visited, false, sizeof visited);
    while(!Stack.empty()) {
        int v = Stack.top();
        Stack.pop();
        if(!visited[v]) {
            dfs2(v);
            // printf("\n");
        }
    }
}
Exemplo n.º 2
0
int main (int argc, char** argv)
{
   if (argc == 1)
   {
      printf("Usage: graph01 input.data\n");
      return 0;
   }

   /* CREATE ADJACENCY LISTS */
   int n = 0, m = 0, result;
   IntList* adj_list; IntList* transpose_list;
   adj_list = loadGraph(&n, &m, argc, argv);
   transpose_list = fix_graph(transposeGraph(adj_list, n), n);

   int discoverTime1[n], finishTime1[n], finishStk[n], parent1[n], counter = 1, stackspot = n;
   memset(discoverTime1, 0, n * sizeof(int));
   memset(finishTime1, 0, n * sizeof(int));
   memset(finishStk, 0, n * sizeof(int));
   memset(parent1, -1, n * sizeof(int));

   int discoverTime2[n], finishTime2[n], dfstRoot[n], parent2[n];
   memset(discoverTime2, 0, n * sizeof(int));
   memset(finishTime2, 0, n * sizeof(int));
   memset(parent2, -1, n * sizeof(int));
   memset(dfstRoot, 0, n * sizeof(int));

   for (int i = 1; i <= n; i++)
      result = dfsTrace1(adj_list, discoverTime1, finishTime1, finishStk, parent1, &counter, i, &stackspot);
   counter = 1;
   for (int i = 0; i < n; i++)
      result = dfsTrace2(transpose_list, discoverTime2, finishTime2, finishStk, parent2, &counter, finishStk[i], dfstRoot, finishStk[i]);
   result = result;


   /* ADJACENCY LIST */
   printf("\n__Adjacency List__\n");

   // print list
   print_list(adj_list, n, m);

   // display stack
   printf("stack: [");
   for (int i = 0; i < n; i++)
   {
      if (i != 0)
         printf(", ");
      printf("%d", finishStk[i]);
   }
   printf("]\n\n");

   // table
   printf("vertex |dtime |ftime |parent\n");
   printf("-------|------|------|------\n");
   for (int i = 0; i < n; i++)
      printf("%7d|%6d|%6d|%6d\n", i + 1, discoverTime1[i], finishTime1[i], parent1[i]);
   printf("\n\n");


   /* TRANSPOSE LIST */
   printf("__Transpose List__\n");

   // print transpose list
   print_list(transpose_list, n, m);
   printf("\n");

   // table
   printf("vertex |dtime |ftime |parent |root\n");
   printf("-------|------|------|-------|-----\n");
   for (int i = 0; i < n; i++)
      printf("%7d|%6d|%6d|%7d|%5d\n", i + 1, discoverTime2[i], finishTime2[i], parent2[i], dfstRoot[i]);
   printf("\n");


   /* FREE MEMORY */
   for (int i = 1; i <= n; i++)
   {
      for (IntList ptr = adj_list[i]; ptr != intNil; ptr = intRest(ptr));
      for (IntList ptr = transpose_list[i]; ptr != intNil; ptr = intRest(ptr));
   }
   free(adj_list);
   free(transpose_list);
}
Exemplo n.º 3
0
int main(int argc, char* argv[]){
   FILE *fp;

   fp = fopen(argv[1], "r");           //reads file
   if(!fp){                //if no file
      perror("No file specified");        //print error
      return -1;
   }
   
   int size = atoi(fgets(line, 1000, fp));         //get the size of the array
   printf("Array Size = %d \n", size);       //print out first line aka size of array

   //struct IntList * list = NULL;
   IntList* array = calloc(size, sizeof(IntList));       //allocate space for array
   
   char * stuff;
   int m;
   int n;
   int ls;
   int j;
   int num = 0;
   //array declaration start
      int dTime1[size];
      int fTime1[size];
      int parent1[size];
      int finishStk1[size];
      //array declaration end
   
   //initialize to null
   for(j = 0; j <= size; j++){
      array[j] = intNil;
   }

   while(fgets(line, 1000, fp) != NULL){        //while there is a line to read 
      stuff = strtok(line, " \t ");       //stuff
      ls = 0;                 //line stuff
      while(stuff != NULL){            //keep goings
         ls++;             //next part on line
         if(ls == 1){            //1st number
            m = atoi(stuff);
         } 
         if(ls == 2){            //2nd number
            n = atoi(stuff);
            if(m >= 0 && m <= size){
                     array[m-1] = intCons(n, array[m-1]);
                     num++;
                  }else printf("No edge for %d, %d\n", m, n);
         }
         stuff = strtok(NULL, " ,.-");    //stops the loop if nothing else is there
      }  
   }
   
int i;   
dfsSweep(array, size, dTime1, fTime1, parent1, finishStk1);
   printf("Original Graph\n");
   //print times and parent for all edges
   for(i = 0; i < size; i++){
      printf("Discover Time [%d]: %d\t", i+1, dTime1[i]);
      printf("Finish Time [%d]: %d\t", i+1, fTime1[i]);
      printf("Parent [%d]: %d \n", i+1, parent1[i]);
   }

   //print the order edges were visited
   printf("Edges:  ");
   for(i = 0; i < size; i++){
      printf("%d  ", finishStk1[i]);
   }
   printf("\n");

   //transpose the graph
   IntList* transGraph = transposeGraph(array, size);

   //print transposed graph
   printf("\nTransposed Graph:\n");

   //array declaration
   int dTime2[size];
   int fTime2[size];
   int parent2[size];
   int dfstRoot2[size];

   dfsSweepT(transGraph, size, dTime2, fTime2, parent2, finishStk1, dfstRoot2);

   //print times and parent for all edges
   for(i = 0; i < size; i++){
      printf("Discover Time [%d]: %d\t", i+1, dTime2[i]);
      printf("Finish Time [%d]: %d\t", i+1, fTime2[i]);
      printf("Parent [%d]: %d \n", i+1, parent2[i]);
   }

   //print the order edges were visited
   printf("Edges:  ");
   for(i = 0; i < size; i++){
      printf("%d  ", dfstRoot2[i]);
   }
   printf("\n");

   //close file and exit  
   fclose(fp);
   return 0;
}