fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void minimize(T& a, const T& b) {
  13. if (b < a) a = b;
  14. }
  15.  
  16. int n;
  17. int C[15][15];
  18. int dp[1 << 15][15]; // dp[mask][i]: Chi phí nhỏ nhất của hành trình đi qua tất cả các nước có trong mask,
  19. // mỗi nước đúng một lần và dừng chân tại đất nước i
  20.  
  21. int main() {
  22. ios::sync_with_stdio(false);
  23. cin.tie(nullptr);
  24. cin >> n;
  25. for (int i = 0; i < n; i++) {
  26. for (int j = 0; j < n; j++) cin >> C[i][j];
  27. }
  28.  
  29. for (int mask = 0; mask < (1 << n); mask++) {
  30. for (int i = 0; i < n; i++) {
  31. int& cur = dp[mask][i];
  32. if (mask == (1 << i)) {
  33. cur = 0;
  34. continue;
  35. }
  36. cur = INF;
  37. if (!(mask & (1 << i))) continue;
  38. for (int j = 0; j < n; j++) {
  39. int prev_mask = mask ^ (1 << i);
  40. minimize(dp[mask][i], dp[prev_mask][j] + C[i][j]);
  41. }
  42. }
  43. }
  44.  
  45. int ans = INF;
  46. for (int i = 0; i < n; i++) {
  47. minimize(ans, dp[(1 << n) - 1][i]);
  48. }
  49.  
  50. cout << ans << '\n';
  51. }
Success #stdin #stdout 0s 5328KB
stdin
6
0 1 2 1 3 4 
5 0 3 2 3 4 
4 1 0 2 1 2 
4 2 5 0 4 3 
2 5 3 5 0 2 
5 4 3 3 1 0
stdout
8