Advertisement
Guest User

Untitled

a guest
Apr 27th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <vector>
  4. #include <limits.h>
  5. #include <algorithm>
  6. using namespace std;
  7. int m_size;
  8. int start_index;
  9. struct point
  10. {
  11.     int mark, mark_max=-1;
  12.     int index;
  13.     vector <point *> attainable_points;
  14.     bool stat = false;
  15. };
  16. void FillTriangleMatrix(int **adj, int **arr, int **tmp);
  17. vector <int> triangle_values_order;
  18. bool AllStatic(point **arr);
  19. point **p_array;
  20. point * Min(point **arr);
  21. int Max(int i, int **arr,int start);
  22. int EmptyColumnIndex(int **arr);
  23. void AdjacencyMatrixFill(int** matrix);
  24. void MatrixShow(int **matrix,bool triangle);
  25. void MinDistance(int** matrix, int start);
  26. void MaxDistance (int **arr, int start);
  27. int main()
  28. {
  29.     printf ("Enter the size of matrix NxN: ");
  30.     scanf ("%d", &m_size);
  31.  
  32.     int **adj_matrix = new int*[m_size];
  33.     for (int i = 0; i < m_size; i++)
  34.         adj_matrix[i] = new int [m_size];
  35.  
  36.     int **triangle_matrix = new int*[m_size];
  37.     for (int i = 0; i < m_size; i++)
  38.         triangle_matrix[i] = new int [m_size];
  39.  
  40.     int **tmp = new int*[m_size];
  41.     for (int i = 0; i < m_size; i++)
  42.         tmp[i] = new int [m_size];
  43.  
  44.     printf ("Enter the start index: ");
  45.     scanf("%d", &start_index);
  46.     AdjacencyMatrixFill(adj_matrix);
  47.     MatrixShow(adj_matrix, false);
  48.     p_array = new point* [m_size]; //array of points
  49.     MinDistance(adj_matrix, start_index);
  50.     for (int i=0; i<m_size; i++)
  51.     {
  52.         printf("%d -> %d)",start_index,i);
  53.         if(p_array[i]->mark!=INT_MAX) printf("%d\n", p_array[i]->mark);
  54.         else printf("SUCH WAY DOESN'T EXIST\n");
  55.     }
  56.     FillTriangleMatrix(adj_matrix, triangle_matrix, tmp);
  57.     printf ("\nTRIANGLE MATRIX\n");
  58.     MatrixShow(triangle_matrix, true);
  59.     MaxDistance(triangle_matrix, start_index);
  60.     for (int i=0; i<m_size; i++)
  61.     {
  62.         if (p_array[i]->mark_max==-1) printf ("%d) SUCH WAY DOESN'T EXIST\n", i);
  63.         else printf ("%d) %d\n", i, p_array[i]->mark_max);
  64.     }
  65. }
  66.  
  67. void AdjacencyMatrixFill(int **matrix)
  68. {
  69.     printf("\nENTER ADJACENCY MATRIX\n");
  70.     for(int i = 0; i < m_size; ++i)
  71.         for(int j = 0; j < m_size; ++j)
  72.         {
  73.             scanf("%d", &matrix[i][j]);
  74.             if (matrix[i][j]== 0)
  75.                 matrix[i][j] = INT_MAX;
  76.         }
  77.     printf("\nADJACENCY MATRIX CREATED\n");
  78. }
  79. void MatrixShow(int **matrix, bool triangle)
  80. {
  81.  
  82.     printf("\t");
  83.     for (int i=0; i<m_size; i++)
  84.     {
  85.         if (triangle) printf("\tx%d", triangle_values_order[i]);
  86.         else printf("\tx%d", i);
  87.     }
  88.     printf("\n");
  89.     for (int i = 0; i < m_size; ++i, printf("\n"))
  90.     {
  91.         if(triangle) printf("\tx%d", triangle_values_order[i]);
  92.         else printf("\tx%d", i);
  93.         for(int j = 0; j < m_size; ++j)
  94.         {
  95.             if (matrix[i][j]==0 || matrix[i][j]==INT_MAX)
  96.                 printf("\t-");
  97.             else
  98.                 printf("\t%d ", matrix[i][j]);
  99.         }
  100.     }
  101. }
  102. void MinDistance(int** matrix, int start)
  103. {
  104.     for(int i = 0; i < m_size; i++)
  105.     {
  106.         point* p = new point;
  107.         if(i==start) p->mark = 0;
  108.         else p->mark = INT_MAX;
  109.         p->index = i;
  110.         p_array[i] = p;
  111.     }
  112.  
  113.     for (int i = 0; i < m_size; i++)
  114.     {
  115.         for(int j = 0; j < m_size; j++)
  116.             if (matrix[i][j] != INT_MAX && i != j)
  117.             {
  118.                 p_array[i]->attainable_points.push_back(p_array[j]);
  119.             }
  120.     }
  121.  
  122.     point * current = p_array[start];
  123.     while (!AllStatic(p_array))
  124.     {
  125.         for (int j = 0; j < current->attainable_points.size(); j++)
  126.         {
  127.             double value  = current->mark + matrix[current->index][current->attainable_points[j]->index];
  128.             if ( value < current->attainable_points[j]->mark)
  129.             {
  130.                 current->attainable_points[j]->mark = value;
  131.             }
  132.         }
  133.         current->stat = true;
  134.         current = Min(p_array);
  135.         if (current->mark==INT_MAX)
  136.             break;
  137.     }
  138. }
  139.  
  140. point * Min(point **arr)
  141. {
  142.     point *p_min;
  143.     for (int i=0; i<m_size; i++)
  144.     {
  145.         if (!arr[i]->stat)
  146.         {
  147.             p_min = arr[i];
  148.             break;
  149.         }
  150.     }
  151.     for (int i = p_min->index; i < m_size; i++)
  152.     {
  153.         if(arr[i]->mark < p_min->mark && arr[i]->stat==false)
  154.             p_min = arr[i];
  155.     }
  156.     return p_min;
  157. }
  158.  
  159. bool AllStatic(point **arr)
  160. {
  161.     for (int i=0; i<m_size; i++)
  162.         if(arr[i]->stat==false) return false;
  163.     return true;
  164. }
  165.  
  166. void FillTriangleMatrix(int **adj, int **arr, int **tmp)
  167. {
  168.  
  169.     for (int i=0; i<m_size; i++)
  170.         for (int j=0; j<m_size; j++)
  171.             tmp[i][j] = adj[i][j];
  172.     int index = EmptyColumnIndex(tmp);
  173.     triangle_values_order.push_back(index);
  174.     int k,p;
  175.     k=0;
  176.     for (int i = 0; i<m_size; i++)
  177.     {
  178.         p = 0;
  179.         for (int j = 0; j<m_size; j++)
  180.         {
  181.             arr[i][j] = adj[triangle_values_order[k]][triangle_values_order[p]];
  182.             p++;
  183.         }
  184.         k++;
  185.     }
  186. }
  187.  
  188. int EmptyColumnIndex(int **arr)
  189. {
  190.     int index;
  191.     while (triangle_values_order.size()!=m_size)
  192.     {
  193.         for(int i=0; i<m_size; i++)
  194.         {
  195.             int cnt = 0;
  196.             std::vector<int>::iterator it;
  197.             it = find (triangle_values_order.begin(), triangle_values_order.end(), i);
  198.             if (it == triangle_values_order.end())
  199.             {
  200.                 for(int j=0; j<m_size; j++)
  201.                 {
  202.                     if(arr[j][i]==INT_MAX || arr[j][i]==0)
  203.                         cnt++;
  204.                 }
  205.                 if (cnt==m_size)
  206.                 {
  207.                     triangle_values_order.push_back(i);
  208.                     index = i;
  209.                     for (int j=0; j<m_size; j++)
  210.                     {
  211.                         arr[index][j] = 0;
  212.                         arr[j][index] = 0;
  213.                     }
  214.                 }
  215.             }
  216.         }
  217.     }
  218. }
  219.  
  220. void MaxDistance (int **arr, int start)
  221. {
  222.     p_array[start]->mark_max = 0;
  223.     int i = triangle_values_order[start];
  224.     do
  225.     {
  226.         int status = Max(i, arr,start);
  227.         if (status) p_array[triangle_values_order[i]]->mark_max = status;
  228.         i++;
  229.     }
  230.     while (i<m_size);
  231. }
  232.  
  233. int Max(int i, int **arr, int start)
  234. {
  235.     int mx = 0;
  236.     int value, j = 0;
  237.     do
  238.     {
  239.         if(arr[j][i]!= INT_MAX && arr[j][i]!=0 && p_array[triangle_values_order[j]]->mark_max!=-1)
  240.         {
  241.             value = arr[j][i] + p_array[triangle_values_order[j]]->mark_max;
  242.             if (mx<value) mx = value;
  243.         }
  244.             j++;
  245.  
  246.     }
  247.     while (j<m_size);
  248.     return mx;
  249. }
  250.  
  251. /*
  252. 0 5 8 7 18 0
  253. 0 0 11 0 0 0
  254. 0 0 0 0 0 17
  255. 0 10 12 0 6 0
  256. 0 7 8 0 0 11
  257. 0 0 0 0 0 0
  258. */
  259.  
  260. /*
  261. 0 6 11 5 0 0
  262. 0 0 0 0 7 2
  263. 0 5 0 0 6 0
  264. 0 0 0 0 4 5
  265. 0 0 0 0 0 7
  266. 0 0 0 0 0 0
  267. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement