Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. int findMinElement(int **a, int n, int j, bool flag) // true - поиск минимума в строке, false - в столбце
  7. {
  8.     int min = 0;
  9.     for (int i = 0; i < n; i++)
  10.         if ((flag && a[j][min] > a[j][i]) || (!flag && a[min][j] > a[i][j]))
  11.             min = i;
  12.  
  13.     return min;
  14. }
  15.  
  16. int calcRating(int **arr, int n, int a, int b)
  17. {
  18.     int min_str = INT_MAX, min_col = INT_MAX;
  19.     for (int i = 0; i < n; i++)
  20.     {
  21.         if (arr[a][i] < min_str && i != b)
  22.             min_str = arr[a][i];
  23.         if (arr[i][b] < min_col && i != a)
  24.             min_col = arr[i][b];
  25.     }
  26.  
  27.     if (min_str == INT_MAX)
  28.         min_str = 0;
  29.     if (min_col == INT_MAX)
  30.         min_col = 0;
  31.     return min_str + min_col;
  32. }
  33.  
  34.  
  35.  
  36.  
  37. int main()
  38. {
  39.     int n, result;
  40.     int **g, **temp, **solve, *path;
  41.     cin >> n;
  42.  
  43.     path = new int[n];
  44.     g = new int*[n];
  45.     temp = new int*[n];
  46.     solve = new int*[n];
  47.     for (int i = 0; i < n; i++)
  48.     {
  49.         g[i] = new int[n];
  50.         temp[i] = new int[n];
  51.         solve[i] = new int[n];
  52.     }
  53.  
  54.  
  55.     int a;
  56.     for (int i = 0; i < n; i++)
  57.     {
  58.         path[i] = -1;
  59.         for (int j = 0; j < n; j++)
  60.         {
  61.  
  62.             if (i != j)
  63.             {
  64.                 cout << i + 1 << " " << j + 1 << ": ";
  65.                 cin >> a;
  66.                 g[i][j] = a;
  67.             }
  68.             else
  69.                 g[i][j] = INT_MAX;
  70.             solve[i][j] = g[i][j];
  71.         }
  72.     }
  73.  
  74.     int count = 0;
  75.     while (count < n - 1)
  76.     {
  77.         for (int i = 0; i < n; i++)
  78.         {
  79.             for (int j = 0; j < n; j++)
  80.                 temp[i][j] = solve[i][j];
  81.         }
  82.  
  83.  
  84.         int min;
  85.  
  86.         //минимум по строке
  87.         for (int i = 0; i < n; i++)
  88.         {
  89.             result = findMinElement(temp, n, i, true);
  90.             min = temp[i][result];
  91.             for (int j = 0; j < n; j++)
  92.                 if (temp[i][j] != INT_MAX)
  93.                     temp[i][j] -= min;
  94.         }
  95.  
  96.         //минимум по столбцу
  97.         for (int i = 0; i < n; i++)
  98.         {
  99.             result = findMinElement(temp, n, i, false);
  100.             min = temp[result][i];
  101.             for (int j = 0; j < n; j++)
  102.                 if (temp[j][i] != INT_MAX)
  103.                     temp[j][i] -= min;
  104.         }
  105.  
  106.  
  107.         //вычисление оценок для нулевых клеток (находим максимальную оценку)
  108.         int i_maxIndex, j_maxIndex, maxValue = -1;
  109.         for (int i = 0; i < n; i++)
  110.         {
  111.             for (int j = 0; j < n; j++)
  112.             {
  113.                 if (temp[i][j] == 0)
  114.                 {
  115.                     result = calcRating(temp, n, i, j);
  116.                     if (result > maxValue)
  117.                     {
  118.                         maxValue = result;
  119.                         i_maxIndex = i;
  120.                         j_maxIndex = j;
  121.                     }
  122.                 }
  123.             }
  124.         }
  125.  
  126.         // записываем путь
  127.         path[i_maxIndex] = j_maxIndex;
  128.  
  129.         //удалем строку и столбец
  130.         for (int i = 0; i < n; i++)
  131.         {
  132.             solve[i][j_maxIndex] = INT_MAX;
  133.             solve[i_maxIndex][i] = INT_MAX;
  134.         }
  135.  
  136.         //удаляем обратный путь
  137.         solve[j_maxIndex][i_maxIndex] = INT_MAX;
  138.        
  139.        
  140.  
  141.         count++;
  142.     }
  143.  
  144.     //в конце всегда остается только 1 дорога - замыкающая
  145.     int start, end;
  146.     int ans = 0;
  147.     for (int i = 0; i < n; i++)
  148.         for (int j = 0; j < n; j++)
  149.             if (solve[i][j] != INT_MAX)
  150.             {
  151.                 start = j;
  152.                 end = i;
  153.                 ans += solve[i][j];
  154.             }
  155.  
  156.  
  157.     //востанавливаем путь
  158.     for (int i = start; path[i] != -1; i = path[i])
  159.     {
  160.         cout << i + 1 << "->";
  161.         ans += g[i][path[i]];
  162.     }
  163.     cout << end + 1  << "->" << start + 1 << endl;
  164.     cout << ans << endl;
  165.  
  166.     return 0;
  167. }
  168.  
  169.  
  170. /*
  171. 4
  172. 5
  173. 11
  174. 9
  175. 10
  176. 8
  177. 7
  178. 7
  179. 14
  180. 8
  181. 12
  182. 6
  183. 15
  184.  
  185. */
  186.  
  187.  
  188. /*
  189.  
  190. 4
  191. 5
  192. 1
  193. 4
  194. 3
  195. 2
  196. 1
  197. 7
  198. 6
  199. 4
  200. 2
  201. 5
  202. 3
  203.  
  204.  
  205.  
  206. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement