CherMi

Lab4 beta

Mar 9th, 2020
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.84 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3.  
  4. #define INF 10000
  5.  
  6. int find_min(int S[15], int D[15], int N);
  7. void printWay(int *P, int v);
  8.  
  9. int main()
  10. {
  11.     int i, j, tmp;
  12.     int N = 15; //Количество вершин
  13.     int matrix[15][15] = //Матрица смежности
  14.     { {INF, 15, INF, INF, INF, INF, INF, INF, 10, 50, INF, INF, INF, INF, INF},
  15.     {INF, INF, 20, 10, 30, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF},
  16.     {INF, INF, INF, INF, INF, 40, INF, INF, INF, INF, INF, INF, INF, INF, INF},
  17.     {INF, INF, INF, INF, 60, INF, INF, INF, 50, INF, INF, INF, INF, INF, INF},
  18.     {INF, INF, INF, INF, INF, INF, 5, INF, INF, INF, INF, INF, INF, INF, INF},
  19.     {INF, INF, INF, INF, INF, INF, 10, INF, INF, INF, INF, INF, INF, INF, INF},
  20.     {INF, INF, INF, INF, INF, INF, INF, 10, INF, INF, INF, INF, INF, INF, INF},
  21.     {INF, INF, INF, INF, INF, INF, INF, INF, INF, 25, 5, INF, INF, INF, INF},
  22.     {INF, INF, INF, INF, INF, INF, INF, 15, INF, INF, INF, INF, INF, INF, INF},
  23.     {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 15, INF, INF},
  24.     {INF, INF, INF, INF, INF, INF, INF, INF, INF, 45, INF, INF, INF, INF, INF},
  25.     {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 15, INF, INF, INF, INF},
  26.     {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 35, INF, 30, INF},
  27.     {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 40},
  28.     {10, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF}};
  29.     int nu, target;
  30.     int S[15] = { 0 };
  31.     int D[15] = { 0 };
  32.     int P[15];
  33.    
  34.     for (i = 0; i < N; i++) //Заполнение массива предыдущих вершин
  35.     {
  36.         P[i] = -1;
  37.     }
  38.  
  39.     //Вывод матрицы смежности
  40.     for (i = 0; i < N; i++)
  41.     {
  42.         printf("\t%d", i + 1);
  43.     }
  44.     printf("\n");
  45.     for (i = 0; i < N; i++)
  46.     {
  47.         printf("%d\t", i + 1);
  48.         for (j = 0; j < N; j++)
  49.         {
  50.             tmp = (matrix[i][j] == INF) ? 0 : matrix[i][j];
  51.             printf("%d\t", tmp);
  52.         }
  53.         printf("\n");
  54.     }
  55.  
  56.     printf("Dijkstra's algorithm:\n");
  57.     printf("Enter start vertex nu: ");
  58.     scanf("%d", &nu);
  59.     printf("Enter target vertex: ");
  60.     scanf("%d", &target);
  61.  
  62.     S[nu - 1] = 1; //Включаем вершину nu в S
  63.    
  64.     for (i = 0; i < N; i++)
  65.     {
  66.         if (matrix[nu - 1][i] < INF)
  67.         {
  68.             P[i] = nu - 1;
  69.         }
  70.     }
  71.  
  72.     for (i = 0; i < N; i++) //Инициализируем D
  73.     {
  74.         if (i == nu - 1)
  75.         {
  76.             D[i] = 0;
  77.             continue;
  78.         }
  79.         D[i] = matrix[nu - 1][i];
  80.     }
  81.  
  82.     for (i = 0; i < N; i++)
  83.     {
  84.         tmp = find_min(S, D, N); //Очередная вершина
  85.         if (tmp < 0) break;
  86.         S[tmp] = 1;
  87.  
  88.         for (j = 0; j < N; j++)
  89.         {
  90.             if (S[j] == 1) continue;
  91.             if (D[j] > D[tmp] + matrix[tmp][j])
  92.             {
  93.                 D[j] = D[tmp] + matrix[tmp][j];
  94.                 P[j] = tmp;
  95.             }
  96.         }
  97.     }
  98.  
  99.  
  100.     printf("\nShortest route from %d to %d is %d\n", nu, target, D[target-1]);
  101.     printf("Path: ");
  102.     printWay(P, target - 1);
  103.  
  104.     printf("\n\nPrima's algorithm\n");
  105.  
  106.     //Делаем граф неориентированным
  107.     for (i = 0; i < N; i++)
  108.     {
  109.         for (j = 0; j <= i; j++)
  110.         {
  111.             tmp = matrix[i][j];
  112.             if (tmp == INF) tmp = 0;
  113.             if (tmp < matrix[j][i] && matrix[j][i] != INF) tmp = matrix[j][i];
  114.             matrix[i][j] = tmp;
  115.             matrix[j][i] = tmp;
  116.         }
  117.     }
  118.  
  119.     //Вывод матрицы смежности
  120.     for (i = 0; i < N; i++)
  121.     {
  122.         printf("\t%d", i + 1);
  123.     }
  124.     printf("\n");
  125.     for (i = 0; i < N; i++)
  126.     {
  127.         printf("%d\t", i + 1);
  128.         for (j = 0; j < N; j++)
  129.         {
  130.             tmp = (matrix[i][j] == INF) ? 0 : matrix[i][j];
  131.             printf("%d\t", tmp);
  132.         }
  133.         printf("\n");
  134.     }
  135.  
  136.     int U[15] = { 0 };
  137.     int result[15][15] = { 0 };
  138.     int min = INF, start_index = -1, end_index = -1;
  139.     int k;
  140.  
  141.     printf("Enter start vertex: ");
  142.     scanf("%d", &nu);
  143.  
  144.     U[nu - 1] = 1; //Выбираем вершину nu
  145.    
  146.     for(k = 0; k < N; k++)
  147.     {
  148.         for (i = 0; i < N; i++)
  149.         {
  150.             if (U[i] == 1)
  151.             {
  152.                 for (j = 0; j < N; j++)
  153.                 {
  154.                     if (U[j] != 1 && matrix[i][j] != 0 && matrix[i][j] < min)
  155.                     {
  156.                         min = matrix[i][j];
  157.                         start_index = i;
  158.                         end_index = j;
  159.                     }
  160.                 }
  161.             }
  162.         }
  163.  
  164.         if (start_index != -1 && end_index != -1)
  165.         {
  166.             result[start_index][end_index] = min;
  167.             result[end_index][start_index] = min;
  168.             U[end_index] = 1;
  169.             min = INF;
  170.             start_index = -1;
  171.             end_index = -1;
  172.         }
  173.     }
  174.  
  175.     printf("Tree:\n");
  176.     for (i = 0; i < N; i++)
  177.     {
  178.         printf("\t%d", i + 1);
  179.     }
  180.     printf("\n");
  181.     for (i = 0; i < N; i++)
  182.     {
  183.         printf("%d\t", i + 1);
  184.         for (j = 0; j < N; j++)
  185.         {
  186.             tmp = (result[i][j] == INF) ? 0 : result[i][j];
  187.             printf("%d\t", tmp);
  188.         }
  189.         printf("\n");
  190.     }
  191.     return 0;
  192. }
  193.  
  194. int find_min(int S[15], int D[15], int N)
  195. {
  196.     int result = -1;
  197.     int min = INF;
  198.     int i;
  199.  
  200.     for (i = 0; i < N; i++)
  201.     {
  202.         if (S[i] == 1) continue;
  203.         if (D[i] < min)
  204.         {
  205.             min = D[i];
  206.             result = i;
  207.         }
  208.     }
  209.  
  210.     return result;
  211. }
  212.  
  213. void printWay(int *P, int v)
  214. {
  215.     if (v == -1)
  216.     {
  217.         return;
  218.     }
  219.     printWay(P, P[v]);
  220.     printf("%d; ", (v + 1));
  221. }
Advertisement
Add Comment
Please, Sign In to add comment