Advertisement
Guest User

Untitled

a guest
May 25th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.83 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "stdlib.h"
  4. #include "conio.h"
  5. #include "math.h"
  6. #include <iostream>
  7. using namespace std;
  8. const int inf = 999;
  9.  
  10. const int vertex = 7;  
  11.  
  12. int M[vertex][vertex] =
  13. {
  14. { 0 , 1 , inf , 3  , inf,inf,2   },
  15. { 1,0,4,3,inf,6,inf },
  16. { inf,4,0,1,inf,2,2 },
  17. { 3,3,1,0,2,inf,inf},
  18. { inf,inf,inf,2,0,2,4},
  19. {inf,6,2,inf,2,0,inf },
  20. {2,inf,2,inf,4,inf,0 }
  21. };
  22.  
  23. int W[vertex] = {0};
  24. int Dw[vertex] = {0};
  25.  
  26. void print(int M[][vertex], int R[][vertex], int S[vertex]) // вывод
  27. {
  28.     int step = 0;
  29.     printf("\nM:");
  30.    
  31.     for (int i = 0; i < vertex; i++)
  32.     {
  33.         printf("\n");
  34.          for (int j = 0; j < vertex; j++)
  35.             {
  36.                 if (M[i][j] == inf)
  37.                     printf("\t -");
  38.                         else
  39.                          printf("\t%d", M[i][j]);
  40.         }
  41.         printf("\n");
  42.     }
  43.  
  44.     printf("R:\n\n");
  45.     printf("\tS");
  46.     printf("\t\t\t\tw");
  47.     printf("\tD(w)");
  48.    
  49.     for (int i = 0;i < vertex; i++)
  50.     printf("\tD(%d)",i);
  51.    
  52.     for (int i = 0; i < vertex; i++)
  53.     {
  54.         printf("\n");
  55.         printf("(");
  56.        
  57.       for (int i = 0; i <= step; i++)
  58.       {
  59.         if(S[i] ||  i==0)
  60.             if(i != step)
  61.                 printf("%d,", S[i]);
  62.             else
  63.                 printf("%d", S[i]);
  64.       }
  65.  
  66.         printf(")\t");
  67.         printf("\t\t");
  68.    
  69.       if (step <= vertex / 2)
  70.         printf("\t");
  71.        
  72.       if(W[i])
  73.         printf("\t%2d",W[i]);
  74.       else
  75.         printf("\t -");
  76.        
  77.       if(Dw[i])
  78.         printf("\t%2d",Dw[i]);
  79.       else
  80.         printf("\t -");
  81.            
  82.       for (int j = 0; j < vertex ; j++)
  83.       {
  84.             if (R[i][j] == 0 || R[i][j] == inf)
  85.                 printf("\t -");
  86.             else
  87.                 printf("\t%2d", R[i][j]);
  88.       }
  89.         printf("\n");
  90.         step++;
  91.     }
  92.    
  93.    
  94. }
  95.  
  96. int getMinimal(int A, int B) // возвращает минимум
  97. {
  98.     if (A <= B)
  99.         return A;
  100.     else
  101.         return B;
  102. }
  103.  
  104. bool entryVertex(int *Array, int toFind) // смотрит, взяли ли мы уже эту вершину
  105. {
  106.     for (int i = 0; i < vertex; i++)
  107.     {
  108.         if (toFind == Array[i])
  109.             return true;
  110.     }
  111.     return false;
  112. }
  113.  
  114. int getMinimalLine(int R[][vertex], int *D, int k) // ищет минимальное значение в строке
  115. {
  116.     int minimal = inf;
  117.     int minimalIndex;
  118.  
  119.     for (int i = 0; i < vertex; i++)
  120.     {
  121.         if (entryVertex(D, i) == false)
  122.           if (R[k][i] <= minimal)
  123.           {
  124.             minimal = R[k][i];
  125.             minimalIndex = i;
  126.           }
  127.     }
  128.     return minimalIndex;
  129. }
  130.  
  131. int main()
  132. {
  133.    
  134.     int R[vertex][vertex];
  135.     int D[vertex];
  136.  
  137.     int s = 0, w = 0, k = 0, d = 0, minimalIndex;
  138.  
  139.     for (int i = 0; i < vertex; i++) // заполняем все нолями
  140.         for (int j = 0; j < vertex; j++)
  141.             R[i][j] = 0;
  142.  
  143.     for (int i = 0; i < vertex+1; i++) // это путь, по-моему
  144.         D[i] = 0;
  145.  
  146.     for (int j = 0; j < vertex; j++)
  147.         R[k][j] = M[k][j];
  148.    
  149.  
  150.     minimalIndex = getMinimalLine(R, D, k); // ищем минимальное значение в строке, получаем индекс
  151.  
  152.     s = R[k][minimalIndex]; // выбираем элемент
  153.     w = minimalIndex; //  запоминаем его иднекс
  154.     D[d] = minimalIndex; // вносим его в наш путь
  155.     d++; // переходим на следующий шаг
  156.    
  157.     for(k=1;k<vertex;k++) // для всех следующих шагов
  158.     {
  159.         W[k] = w; // добавляемая вершина
  160.         Dw[k] = s; //
  161.        
  162.         for (int j = 1; j < vertex; j++)
  163.         {
  164.             if (entryVertex(D, j) == false) // если еще не брали вершину
  165.             {
  166.                 R[k][j] = getMinimal(R[k - 1][j], Dw[k] + M[W[k]][j]); // добавляем ее, считаем общую стоимость пути (по-моему, хз)
  167.                 minimalIndex = getMinimalLine(R, D, k); // ищем минимальный в строчке
  168.             }
  169.         }
  170.         s = R[k][minimalIndex]; // выбираем элемент
  171.         w = minimalIndex; // запоминаем его индекс
  172.         D[d] = minimalIndex; // добавляем в путь
  173.         d++; // следующий шаг
  174.     }
  175.     print(M, R, D);
  176.    
  177.     return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement