Advertisement
CherMi

Lab 4 v0.9

Feb 10th, 2020
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.09 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <malloc.h>
  4.  
  5. int main()
  6. {
  7.     unsigned int N, nu, action;
  8.     unsigned int i, j, tmp;
  9.     int *matrix = NULL;
  10.  
  11.     printf("Matrix from keyboard - 1, from file - 2: ");
  12.     scanf("%d", &action);
  13.     if(action == 1)
  14.     {
  15.         printf("Enter amount of vertexes: ");
  16.         scanf("%d", &N);
  17.         N = 5;
  18.         matrix = (int *)malloc(N * N * sizeof(int)); //Матрица смежности
  19.  
  20.         for (i = 0; i < N; i++)
  21.         {
  22.             for (j = 0; j < N; j++)
  23.             {
  24.                 if (i != j)
  25.                 {
  26.                     printf("Route frome vertex %d to vertex %d is: ", i + 1, j + 1);
  27.                     scanf("%d", &tmp);
  28.                     if (tmp == 0)
  29.                     {
  30.                         tmp = 10000; //Принимаем за бесконечность
  31.                     }
  32.                 }
  33.                 else
  34.                     tmp = 10000;
  35.                 matrix[i * N + j] = tmp;
  36.             }
  37.         }
  38.     }
  39.     else if (action == 2)
  40.     {
  41.         FILE *in;
  42.         if ((in = fopen("C:\\test\\graph.txt", "rt")) == NULL)
  43.         {
  44.             printf("Could not open file");
  45.             return -1;
  46.         }
  47.         fscanf(in, "%d", &N);
  48.         matrix = (int *)malloc(N * N * sizeof(int)); //Матрица смежности
  49.        
  50.         for (i = 0; i < N; i++)
  51.         {
  52.             for (j = 0; j < N; j++)
  53.             {
  54.                 fscanf(in, "%d", &tmp);
  55.                 if (tmp == 0)
  56.                 {
  57.                     tmp = 10000; //Принимаем за бесконечность
  58.                 }
  59.                 matrix[i * N + j] = tmp;
  60.             }
  61.         }
  62.         fclose(in);
  63.     }
  64.    
  65.     //Алгоритм Дейскстры
  66.     printf("Enter target vertex: ");
  67.     scanf("%d", &tmp);
  68.     nu = tmp - 1;
  69.  
  70.     int *S = (int *)calloc(N, sizeof(int)); //Массив просмотренных вершин
  71.     int *D = (int *)malloc(N * sizeof(int)); //Массив кратчайших расстояний
  72.  
  73.     S[nu] = 1; //Первая вершина
  74.     for (j = 0; j < N; j++)
  75.     {
  76.         if (j == nu)
  77.         {
  78.             D[j] = 0;
  79.             continue;
  80.         }
  81.         D[j] = matrix[j];
  82.     }
  83.  
  84.     for (i = 0; i < N; i++)
  85.     {
  86.         tmp = find_min_positive(D, S, N); //Очередная вершина
  87.         if (tmp < 0 || tmp >= N) break;
  88.         S[tmp] = 1;
  89.         for (j = 0; j < N; j++)
  90.         {
  91.             if (S[j] == 1) continue;
  92.             D[j] = (D[j] < D[tmp] + matrix[tmp * N + j]) ? D[j] : D[tmp] + matrix[tmp * N + j];
  93.         }
  94.     }
  95.  
  96.     for (i = 0; i < N; i++)
  97.     {
  98.         printf("Shortest route from %d to %d is %d\n", nu + 1, i + 1, D[i]);
  99.     }
  100.     free(S);
  101.     free(D);
  102.    
  103.     //Алгоритм Прима
  104.     //Делаем граф неориентированным
  105.     for (i = 0; i < N; i++)
  106.     {
  107.         for (j = 0; j < N; j++)
  108.         {
  109.             tmp = matrix[i * N + j];
  110.             if (tmp == 10000) tmp = 0;
  111.             if (tmp < matrix[j * N + i] && matrix[j * N + i] != 10000) tmp = matrix[j * N + i];
  112.             matrix[i * N + j] = tmp;
  113.             matrix[j * N + i] = tmp;
  114.         }
  115.     }
  116.  
  117.     printf("\nGraph's adjacency matrix: \n");
  118.     for (i = 0; i < N; i++)
  119.     {
  120.         for (j = 0; j < N; j++)
  121.         {
  122.             printf("%d\t", matrix[i * N + j]);
  123.         }
  124.         printf("\n");
  125.     }
  126.  
  127.     printf("Enter target vertex: ");
  128.     scanf("%d", &nu);
  129.    
  130.     int *U = calloc(N, sizeof(int));
  131.     int *result = (int *)calloc(N * N, sizeof(int));
  132.     int min = 10000, start_index = -1, end_index = -1;
  133.     U[nu-1] = 1; //Выбираем вершину nu
  134.    
  135.     for(tmp = 0; tmp < N; tmp++)
  136.     {
  137.         for (i = 0; i < N; i++)
  138.         {
  139.             if (U[i] == 1)
  140.             {
  141.                 for (j = 0; j < N; j++)
  142.                 {
  143.                     if (U[j] != 1 && matrix[i * N + j] != 0 && matrix[i * N + j] < min)
  144.                     {
  145.                         min = matrix[i * N + j];
  146.                         start_index = i;
  147.                         end_index = j;
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.         if (start_index != -1 && end_index != -1)
  153.         {
  154.             result[start_index * N + end_index] = min;
  155.             result[end_index * N + start_index] = min;
  156.             U[end_index] = 1;
  157.             min = 10000;
  158.             start_index = -1;
  159.             end_index = -1;
  160.         }
  161.     }
  162.  
  163.     for (i = 0; i < N; i++)
  164.     {
  165.         for (j = 0; j < N; j++)
  166.         {
  167.             printf("%d\t", result[i * N + j]);
  168.         }
  169.         printf("\n");
  170.     }
  171.     free(matrix);
  172.     free(U);
  173.     free(result);
  174.  
  175.     return 0;
  176. }
  177.  
  178. int find_min_positive(int *arr, int *S, int N) //Находит минимальный положительный элемент массива и возвращает его индекс
  179. {
  180.     int i;
  181.     int result = -1;
  182.     int min = INT_MAX;
  183.     for (i = 0; i < N; i++)
  184.     {
  185.         if (arr[i] < 0 || S[i] == 1)
  186.             continue;
  187.         if (arr[i] < min)
  188.         {
  189.             min = arr[i];
  190.             result = i;
  191.         }
  192.     }
  193.     return result;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement