Advertisement
JohnathanMayhem

2-d

Jul 10th, 2022
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define N 301
  4. int array[N][N] = {0}, d[N][N] = {0}, v[N] = {0};
  5. int MAX = 2147483647;
  6.  
  7. struct list {
  8.     int data;
  9.     struct list *next;
  10. };
  11.  
  12. typedef struct stack {
  13.     struct list *top;
  14. } Stack;
  15.  
  16. Stack *create() {
  17.     Stack *S;
  18.     S = (Stack *) malloc(sizeof(Stack));
  19.     S->top = NULL;
  20.     return S;
  21. }
  22.  
  23. int pop(Stack *S) {
  24.     int a;
  25.     struct list *p;
  26.     p = S->top;
  27.     a = p->data;
  28.     S->top = p->next;
  29.     free(p);
  30.     return a;
  31. }
  32.  
  33. void push(Stack *S, int a) {
  34.     struct list *p;
  35.     p = (struct list *) malloc(sizeof(struct list));
  36.     p->data = a;
  37.     p->next = S->top;
  38.     S->top = p;
  39. }
  40.  
  41. int main() {
  42.     freopen("input.txt", "r", stdin);
  43.     int n, m, p, k;
  44.     scanf("%d%d%d%d", &n, &m, &p, &k);
  45.     int transfer_rate, s_1, s_2;
  46.     for (int i = 0; i < m; ++i) {
  47.         scanf("%d %d %d", &s_1, &s_2, &transfer_rate);
  48.         if (array[s_1][s_2] == 0 || array[s_1][s_2] > transfer_rate) {
  49.             array[s_1][s_2] = transfer_rate;
  50.             array[s_2][s_1] = transfer_rate;
  51.         }
  52.     }
  53.  
  54.     int finish, weight, count, min_index, min, temp;
  55.     Stack *stack = create();
  56.  
  57.     for (int j = 0; j < (n + 1); ++j) {
  58.         for (int i = 1; i < (n + 1); ++i) {
  59.             d[j][i] = MAX;
  60.             v[i] = 1;
  61.         }
  62.         d[j][j] = 0;
  63.         do {
  64.             min_index = MAX;
  65.             min = MAX;
  66.             for (int i = 1; i < (n + 1); ++i) {
  67.                 if ((v[i] == 1) && (d[j][i] < min)) {
  68.                     min = d[j][i];
  69.                     min_index = i;
  70.                 }
  71.             }
  72.             if (min_index != MAX) {
  73.                 for (int i = 1; i < (n + 1); ++i) {
  74.                     if (array[min_index][i] > 0) {
  75.                         temp = min + array[min_index][i];
  76.                         if (temp < d[j][i]) {
  77.                             d[j][i] = temp;
  78.                         }
  79.                     }
  80.                 }
  81.                 v[min_index] = 0;
  82.             }
  83.         } while (min_index < MAX);
  84.     }
  85.  
  86.     int start, final;
  87.     for (int j = 0; j < p; ++j) {
  88.         scanf("%d %d", &start, &final);
  89.         printf("%d ", d[start][final]);
  90.         finish = final;
  91.         weight = d[start][finish];
  92.         count = 1;
  93.         while (finish != start) {
  94.             for (int i = 1; i < (n + 1); ++i)
  95.                 if (array[i][finish] != 0) {
  96.                     temp = weight - array[i][finish];
  97.                     if (temp == d[start][i]) {
  98.                         weight = temp;
  99.                         finish = i;
  100.                         ++count;
  101.                         push(stack, i);
  102.                     }
  103.                 }
  104.         }
  105.         printf("%d ", count);
  106.         while (stack->top != NULL) printf("%d ", pop(stack));
  107.         printf("%d", final);
  108.         printf("\n");
  109.     }
  110.  
  111.     for (int j = 0; j < k; ++j) {
  112.         scanf("%d %d", &start, &final);
  113.         printf("%d\n", d[start][final]);
  114.     }
  115.  
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement