Advertisement
ibragimova_mariam

Коммивояжер (динамика по битовым маскам)

Aug 3rd, 2020
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1.  
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.util.*;
  5.  
  6. import static java.lang.Integer.MAX_VALUE;
  7. import static java.lang.Integer.reverse;
  8. import static java.lang.Math.min;
  9.  
  10. public class MySolution
  11. {
  12. public static void main(String[] args)
  13. throws FileNotFoundException {
  14. Scanner in = new Scanner(new File("salesman2.in"));//new File("f.in")
  15.  
  16. int n = in.nextInt();
  17.  
  18. int[][] a = new int[n][n];
  19.  
  20. for(int i = 0; i < n; i++)
  21. {
  22. for (int j = 0; j < n; j++)
  23. {
  24. a[i][j] = in.nextInt();
  25. }
  26. }
  27. int[][] d = new int[1 << n][n];
  28. int[][] p = new int[1 << n][n];
  29. for (int mask = 0; mask < (1 << n); mask++)
  30. {
  31. for (int i = 0; i < n; i++)
  32. {
  33. d[mask][i] = MAX_VALUE;
  34. }
  35. }
  36.  
  37. d[0][0] = 0;
  38.  
  39. for (int mask = 0; mask < (1 << n); mask++)
  40. {
  41. for (int i = 0; i < n; i++)
  42. {
  43. if (d[mask][i] == MAX_VALUE)
  44. continue;
  45.  
  46. for (int j = 0; j < n; j++)
  47. {
  48. if ((mask & (1 << j)) == 0) // в маске нет города j
  49. {
  50. if (d[mask][i] + a[i][j] < d[mask ^ (1 << j)][j]) {
  51. d[mask ^ (1 << j)][j] = d[mask][i] + a[i][j];
  52. p[mask ^ (1 << j)][j] = i;
  53. }
  54. }
  55. }
  56. }
  57. }
  58.  
  59. System.out.println(d[(1 << n) - 1][0]);
  60. System.out.println();
  61. int[] lp = new int[n];
  62.  
  63. int i = 0;
  64. int mask = (1 << n) - 1;
  65. int last = 0;
  66. do
  67. {
  68. lp[i++] = p[mask][last];
  69. int maskPrev = mask;
  70. mask = mask ^ (1 << last);
  71. last = p[maskPrev][last];
  72. } while (mask != 0);
  73.  
  74. if (lp[0] < lp[n - 2])
  75. {
  76. System.out.print(0 + " " );
  77. for (int j = 0; j < n - 1; j ++)
  78. {
  79. System.out.print(lp[j] + " " );
  80. }
  81. }
  82. else
  83. {
  84. for (int j = n - 1; j >= 0; j--)
  85. {
  86. System.out.print(lp[j] + " ");
  87. }
  88. }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement