Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. #include <time.h>
  5. #include <string.h>
  6. #define MAX 101
  7.  
  8. int* initGraph(int n) {
  9.     int *graph = (int*) calloc(n*n, sizeof(int));
  10.     return graph;
  11. }
  12.  
  13. void fillGraph(int *g, int n) {
  14.     srand (time(NULL));
  15.     for (int i = 0; i < n; i++) {
  16.         for (int j = 0; j < n; j++) {
  17.             if (i != j) {
  18.                 int r = rand();
  19.                 g[i*n + j] = (r < RAND_MAX/2) ? r % 100 : 0;
  20.             }
  21.         }
  22.     }
  23. }
  24.  
  25. void BellmanFord(int* g, int n, int* distances, int* parents) {
  26.  
  27.   for (int k = 0; k < n - 1; k++) {
  28.     for (int i = 0; i < n; i++) {
  29.       for (int j = 0; j < n; j++) {
  30.         if (i == j || !g[j * n + i]) {
  31.             continue;
  32.         }
  33.         if (distances[i] > distances[j] + g[j * n + i]) {
  34.             distances[i] = distances[j] + g[j * n + i];
  35.             parents[i] = j;
  36.             printf("parents[%d] = %d\n", i, parents[i]);
  37.         }
  38.       }
  39.     }
  40.   }
  41. }
  42.  
  43. void printGraph(int* g, int n, int* d, int* p) {
  44.     printf("digraph G {\n");
  45.  
  46.     for (int i = 0; i < n; i++)
  47.         printf("%d [label=\"%d / %d\"];\n", i, i, d[i]);
  48.        
  49.     for (int i = 0; i < n; i++) {
  50.         for (int j = 0; j < n; j++) {
  51.             if (g[i*n + j]) {
  52.                 if (p[j] == i) {
  53.                     printf("%d -> %d [label=\"%d\", color=\"red\"];\n", i, j, g[i*n + j]);
  54.                 } else {
  55.                     printf("%d -> %d [label=\"%d\"];\n", j, i, g[i*n + j]);
  56.                 }
  57.                
  58.             }
  59.         }
  60.     }
  61.     printf("}");
  62. }
  63.  
  64. int main(void) {
  65.     int n = 10;
  66.  
  67.     int s = 0;
  68.     int t = 9;
  69.  
  70.     int *g = initGraph(n);
  71.  
  72.     fillGraph(g, n);
  73.     int* distances = (int*) malloc (sizeof(int) * n);
  74.     int* parents  = (int*) malloc(sizeof(int)*n);
  75.    
  76.     for (int i = 0; i < n; i++) {
  77.       parents[i] = -1;
  78.     }
  79.    
  80.     for (int i = 0; i < n; i++) {
  81.       distances[i] = (i == s ? 0 : MAX);
  82.     }
  83.  
  84.     BellmanFord(g, n,distances,parents);
  85.  
  86.     printGraph(g, n, distances, parents);
  87.  
  88.     free(g);
  89.  
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement