Advertisement
CherMi

Lab 4

Feb 10th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.86 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include <limits.h>
  5.  
  6. int main()
  7. {
  8.     unsigned int N, nu;
  9.     unsigned int i, j, tmp;
  10.  
  11.     printf("Enter amount of vertexes: ");
  12.     scanf("%d", &N);
  13.  
  14.     int *matrix = (int *)malloc(N * N * sizeof(int)); //Матрица смежности
  15.  
  16.     for (i = 0; i < N; i++)
  17.     {
  18.         for (j = 0; j < N; j++)
  19.         {
  20.             if (i != j)
  21.             {
  22.                 printf("Route frome vertex %d to vertex %d is: ", i + 1, j + 1);
  23.                 scanf("%d", &tmp);
  24.                 if (tmp == 0)
  25.                 {
  26.                     tmp = 10000; //Принимаем за бесконечность
  27.                 }
  28.             }
  29.             else
  30.                 tmp = 10000;
  31.             matrix[i * N + j] = tmp;
  32.         }
  33.     }
  34.  
  35.     printf("Enter target vertex: ");
  36.     scanf("%d", &tmp);
  37.     nu = tmp - 1;
  38.  
  39.     unsigned int *S = (int *)calloc(N, sizeof(int)); //Массив просмотренных вершин
  40.     int *D = (int *)malloc(N * sizeof(int)); //Массив кратчайших расстояний
  41.  
  42.     S[nu] = 1; //Первая вершина
  43.     for (j = 0; j < N; j++)
  44.     {
  45.         if (j == nu)
  46.         {
  47.             D[j] = 0;
  48.             continue;
  49.         }
  50.         D[j] = matrix[j];
  51.     }
  52.  
  53.     for (i = 0; i < N; i++)
  54.     {
  55.         tmp = find_min_positive(D, S, N); //Очередная вершина
  56.         if (tmp < 0) break;
  57.         S[tmp] = 1;
  58.         for (j = 0; j < N; j++)
  59.         {
  60.             if (S[j] == 1) continue;
  61.             D[j] = (D[j] < D[tmp] + matrix[tmp * N + j]) ? D[j] : D[tmp] + matrix[tmp * N + j];
  62.         }
  63.     }
  64.  
  65.     for (i = 0; i < N; i++)
  66.     {
  67.         printf("D[%d] = %d\n", i + 1, D[i]);
  68.     }
  69.     return 0;
  70. }
  71.  
  72. int find_min_positive(int *arr, int *S, int N) //Находит минимальный положительный элемент массива и возвращает его индекс
  73. {
  74.     int i;
  75.     int result = -1;
  76.     int min = INT_MAX;
  77.     for (i = 0; i < N; i++)
  78.     {
  79.         if (arr[i] < 0 || S[i] == 1)
  80.             continue;
  81.         if (arr[i] < min)
  82.         {
  83.             min = arr[i];
  84.             result = i;
  85.         }
  86.     }
  87.     return result;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement