Advertisement
CherMi

Lab4 1

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