Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.24 KB | None | 0 0
  1. #define NODES 5
  2. #define MIN(X,Y) X < Y ? X : Y
  3. #define INFINITE 10000000
  4.  
  5. char letters[5] = {'s', 'A','B','C','t'};
  6.  
  7. void push(const int * const * C, int ** F, int *excess, int u, int v) {
  8.   int send = MIN(excess[u], C[u][v] - F[u][v]);
  9.   F[u][v] += send;
  10.   F[v][u] -= send;
  11.   excess[u] -= send;
  12.   excess[v] += send;
  13.  
  14.   if (send != 0)
  15.     printf("Pushed %d from %c to %c\n", send, letters[u], letters[v]);
  16. }
  17.  
  18. void relabel(const int * const * C, const int * const * F, int *height, int u) {
  19.   int v;
  20.   int min_height = INFINITE;
  21.   for (v = 0; v < NODES; v++) {
  22.     if (C[u][v] - F[u][v] > 0) {
  23.       min_height = MIN(min_height, height[v]);
  24.       height[u] = min_height + 1;
  25.     }
  26.   }
  27.   printf("Relabeled %c to height %d\n", letters[u], height[u]);
  28. }
  29.  
  30. void discharge(const int * const * C, int ** F, int *excess, int *height, int *seen, int u) {
  31.   while (excess[u] > 0) {
  32.     if (seen[u] < NODES) {
  33.       int v = seen[u];
  34.       if ((C[u][v] - F[u][v] > 0) && (height[u] > height[v])){
  35.         push(C, F, excess, u, v);
  36.       }
  37.       else
  38.         seen[u] += 1;
  39.     } else {
  40.       relabel(C, F, height, u);
  41.       seen[u] = 0;
  42.     }
  43.   }
  44. }
  45.  
  46. void moveToFront(int i, int *A) {
  47.   int temp = A[i];
  48.   int n;
  49.   for (n = i; n > 0; n--){
  50.     A[n] = A[n-1];
  51.   }
  52.   A[0] = temp;
  53. }
  54.  
  55. int pushRelabel(const int * const * C, int ** F, int source, int sink) {
  56.   int *excess, *height, *list, *seen, i, p;
  57.  
  58.   excess = (int *) calloc(NODES, sizeof(int));
  59.   height = (int *) calloc(NODES, sizeof(int));
  60.   seen = (int *) calloc(NODES, sizeof(int));
  61.  
  62.   list = (int *) calloc((NODES-2), sizeof(int));
  63.  
  64.   for (i = 0, p = 0; i < NODES; i++){
  65.     if((i != source) && (i != sink)) {
  66.       list[p] = i;
  67.       p++;
  68.     }
  69.   }
  70.  
  71.   height[source] = NODES;
  72.   excess[source] = INFINITE;
  73.   for (i = 0; i < NODES; i++)
  74.     push(C, F, excess, source, i);
  75.  
  76.   p = 0;
  77.   while (p < NODES - 2) {
  78.     int u = list[p];
  79.     int old_height = height[u];
  80.     discharge(C, F, excess, height, seen, u);
  81.     if (height[u] > old_height) {
  82.       moveToFront(p,list);
  83.       p=0;
  84.     }
  85.     else
  86.       p += 1;
  87.   }
  88.   int maxflow = 0;
  89.   for (i = 0; i < NODES; i++)
  90.     maxflow += F[source][i];
  91.    
  92.   printf("Heights:\n");
  93.   for (i = 0; i < NODES; i++)
  94.     printf("%d\t", height[i]);
  95.   printf("\n");
  96.  
  97.   free(list);
  98.  
  99.   free(seen);
  100.   free(height);
  101.   free(excess);
  102.  
  103.   return maxflow;
  104. }
  105.  
  106. void printMatrix(const int * const * M) {
  107.   int i,j;
  108.   for (i = 0; i < NODES; i++) {
  109.     for (j = 0; j < NODES; j++)
  110.       printf("%d\t",M[i][j]);
  111.     printf("\n");
  112.   }
  113. }
  114.  
  115. int main(void) {
  116.   int **flow, **capacities, i;
  117.   flow = (int **) calloc(NODES, sizeof(int*));
  118.   capacities = (int **) calloc(NODES, sizeof(int*));
  119.   for (i = 0; i < NODES; i++) {
  120.     flow[i] = (int *) calloc(NODES, sizeof(int));
  121.     capacities[i] = (int *) calloc(NODES, sizeof(int));
  122.   }
  123.  
  124.   capacities[0][1] = 7;
  125.   capacities[0][3] = 4;
  126.   capacities[1][2] = 6;
  127.   capacities[1][3] = 4;
  128.   capacities[2][3] = 7;
  129.   capacities[2][4] = 4;
  130.   capacities[3][1] = 3;
  131.   capacities[3][4] = 7;
  132.  
  133.   printf("Capacity:\n");
  134.   printMatrix(capacities);
  135.  
  136.   printf("Max Flow:\n%d\n", pushRelabel(capacities, flow, 0, 5));
  137.  
  138.   printf("Flows:\n");
  139.   printMatrix(flow);
  140.  
  141.   return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement