Advertisement
lIlIlIlIIlI

Algorithms_DFS, Topology Sort

Sep 9th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct node{
  5.     int nb[10];
  6.     int nbLen;
  7.     int color;
  8.     int from;
  9.     int touch;
  10.     int finish;
  11. };
  12.  
  13. struct node N[10];
  14.  
  15. struct tuple{
  16.     int ind;
  17.     int fnsh;
  18. };
  19.  
  20. //struct node T;
  21. //T.nbLen;
  22. //scanf("%d", &T.nb[2]);
  23. //scanf("%d", N[2].nb[8]);
  24. int nl, nbl;
  25. int time;
  26.  
  27. int arr[10];
  28. int len = 10;
  29. int top = -1;
  30. int isFull();
  31. int isEmpty();
  32. int push(int n);
  33. int pop();
  34.  
  35. // void printStack();
  36.  
  37. int isFull(){
  38.     if(top == len-1)
  39.         return 1;
  40.     else
  41.         return 0;  
  42. }
  43.  
  44. int isEmpty(){
  45.     if(top <= -1)
  46.         return 1;
  47.     else
  48.         return 0;
  49. }
  50.  
  51. int push(int n){
  52.     if(isFull() != 1){
  53.         top++;
  54.         arr[top] = n;
  55.         return 1;
  56.     }else{
  57.         printf("full");
  58.         return 0;
  59.     }
  60. }
  61.  
  62. int pop(){
  63.     if(isEmpty() != 1){
  64.         top--;
  65.         return arr[top+1];
  66.     }else{
  67.         printf("is Empty");
  68.         return -1;
  69.     }
  70. }
  71.  
  72. //void printStack(){
  73. //  int i;
  74. //  for(i = 0; i <= top; i++)
  75. //      printf("%d ", arr[i]);
  76. // 
  77. //  printf("\n");  
  78. //}
  79.  
  80. void printNB(int n){
  81.     int i;
  82.     for(i = 0; i < N[n].nbLen ; i++)
  83.         printf("%d ", N[n].nb[i]);
  84.        
  85.     printf("\n");
  86. }
  87.  
  88. int initialize(){
  89.     int i;
  90.     for(i = 0; i < nl; i++){
  91.         N[i].color = 100;
  92.         N[i].from = -1;
  93.         N[i].touch = 0;
  94.         N[i].finish = 0;
  95.     }
  96.    
  97.     time = 1;
  98. }
  99.  
  100. void DFS(int m){
  101.     push(m);
  102.     N[m].color = 200;
  103.     N[m].touch = time;
  104.     time++;
  105.     int j;
  106.     for(j = 0; j < N[m].nbLen; j++){
  107.         if(N[ N[m].nb[j] ].color == 100)
  108.             DFS(N[m].nb[j]);
  109.     }
  110.    
  111.     pop();
  112.     N[m].color = 300;
  113.     N[m].finish = time;
  114.     time++;
  115. }
  116.  
  117. int compare(const void *a, const void *b){
  118.     struct tuple* A = (struct tuple*)a;
  119.     struct tuple* B = (struct tuple*)b;
  120.     if (A[0].fnsh < B[0].fnsh) return 1;
  121.     else if (A[0].fnsh > B[0].fnsh) return -1;
  122.     else return 0;
  123. }
  124.  
  125. void print(){  
  126.     struct tuple M[10];
  127.     int i;
  128.     for(i = 0; i < nl; i++){
  129.         M[i].ind = i;
  130.         M[i].fnsh = N[i].finish;   
  131.     }
  132.    
  133.     qsort(M, nl, sizeof(struct tuple), compare);
  134.     for(i = 0; i < nl; i++)
  135.         printf("%d ", M[i].ind);
  136.    
  137. }
  138.  
  139. int main(){
  140.     int i; 
  141. //  for(i=0;i<7;i++) push(i*10);
  142. //  printStack();
  143. //  for(i=0;i<4;i++) printf("%d ",pop());
  144. //  printf("\n");
  145. //  for(i=0;i<8;i++) push(i*100);
  146. //  printStack();
  147.     int index, x, y;
  148.     scanf("%d %d", &nl, &nbl);
  149.     for(i = 0; i < nl; i++)
  150.         N[i].nbLen = 0;
  151.    
  152.     for(i = 0; i < nbl; i++){
  153.         scanf("%d", &x);
  154.         scanf("%d", &y);
  155.         index = N[x].nbLen;
  156.         N[x].nb[ index ] = y;
  157.         N[x].nbLen++;
  158.     }
  159. //  for(i = 0; i < nl; i++) printNB(i);
  160.     initialize();
  161.     int j;
  162.     for(j = 0; j < nl; j++){
  163.         if(N[j].color == 100)
  164.             DFS(j);
  165.     }
  166. //  for(j = 0; j < nl; j++) printf("%d, %d\n", N[j].touch, N[j].finish);
  167.     print();
  168.     return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement