Advertisement
CherMi

Lab4 0.5

Feb 24th, 2020
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.80 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, 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.  
  32.     for (i = 0; i < N; i++)
  33.     {
  34.         printf("\t%d", i + 1);
  35.     }
  36.     printf("\n");
  37.     for (i = 0; i < N; i++)
  38.     {
  39.         printf("%d\t", i + 1);
  40.         for (j = 0; j < N; j++)
  41.         {
  42.             tmp = (matrix[i][j] == INF) ? 0 : matrix[i][j];
  43.             printf("%d\t", tmp);
  44.         }
  45.         printf("\n");
  46.     }
  47.     printf("Dejkstra's algorithm:\n");
  48.     printf("Enter start vertex nu: ");
  49.     scanf("%d", &nu);
  50.     printf("Enter target vertex: ");
  51.     scanf("%d", &target);
  52.  
  53.     S[nu - 1] = 1; //Включаем вершину nu в S
  54.  
  55.     for (i = 0; i < N; i++)
  56.     {
  57.         if (i == nu - 1)
  58.         {
  59.             D[i] = 0;
  60.             continue;
  61.         }
  62.         D[i] = matrix[nu - 1][i]; //TODO: посмотреть, какую строку записываем относительно nu
  63.     }
  64.  
  65.     for (i = 0; i < N; i++)
  66.     {
  67.         tmp = find_min(S, D, N); //Очередная вершина
  68.         if (tmp < 0) break; //TODO: проверить это
  69.         S[tmp] = 1;
  70.  
  71.         for (j = 0; j < N; j++)
  72.         {
  73.             if (S[j] == 1) continue;
  74.             D[j] = (D[j] < D[tmp] + matrix[tmp][j]) ? D[j] : D[tmp] + matrix[tmp][j];
  75.         }
  76.     }
  77.  
  78.     for (i = 0; i < N; i++)
  79.     {
  80.         printf("Shortest route from %d to %d is %d\n", nu, i + 1, D[i]);
  81.     }
  82.     return 0;
  83. }
  84.  
  85. int find_min(int S[15], int D[15], int N)
  86. {
  87.     int result = -1;
  88.     int min = INF;
  89.     int i;
  90.  
  91.     for (i = 0; i < N; i++)
  92.     {
  93.         if (S[i] == 1) continue;
  94.         if (D[i] < min)
  95.         {
  96.             min = D[i];
  97.             result = i;
  98.         }
  99.     }
  100.  
  101.     return result;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement