Advertisement
skaram

Untitled

Oct 9th, 2022
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.58 KB | None | 0 0
  1. /* === динамика вперед === */
  2.  
  3. // #pragma GCC optimize("Ofast")
  4. #include <bits/stdc++.h>
  5. #ifdef Local
  6. #include "debug/debug.h"
  7. #else
  8. #define debug(...)
  9. #endif
  10.  
  11. typedef long long ll;
  12. typedef long double ld;
  13.  
  14. #define int ll
  15.  
  16. #define vec vector
  17. #define str string
  18. #define all(x) (x).begin(), (x).end()
  19. #define rall(x) (x).rbegin(), (x).rend()
  20. #define sz(x) (int)(x).size()
  21. #define pb push_back
  22.  
  23. using namespace std;
  24.  
  25. struct point {
  26.     int x, y;
  27. };
  28.  
  29. int sq(int x) {
  30.     return x * x;
  31. }
  32.  
  33. int dist2(point a, point b) {
  34.     return sq(b.x - a.x) + sq(b.y - a.y);
  35. }
  36.  
  37. ld dist(point a, point b) {
  38.     return sqrt(sq(b.x - a.x) + sq(b.y - a.y));
  39. }
  40.  
  41. void solve() {
  42.     point st;
  43.     cin >> st.x >> st.y;
  44.     int n;
  45.     cin >> n;
  46.     vec<point> a(n);
  47.     vec<vec<int>> g(n, vec<int>(n));
  48.     for (point& i : a)
  49.         cin >> i.x >> i.y;
  50.     int ans = 0;
  51.     for (int i = 0; i < n; i++) {
  52.         g[i][i] = dist2(st, a[i]);
  53.         ans += g[i][i];
  54.         for (int j = i + 1; j < n; j++) {
  55.             g[i][j] = g[j][i] = dist2(a[i], a[j]);
  56.         }
  57.     }
  58.     const int P = 1 << n;
  59.     vec<int> dp(P, 1e10);
  60.     vec<pair<int, int>> pr(P, {-1, -1});
  61.     dp[0] = 0;
  62.     for (int p = 0; p < P; p++) {
  63.         for (int i = 0, k = 1; i < n; i++, k *= 2) {
  64.             if (!(p & k)) {
  65.                 int d = p | k;
  66.                 if (dp[d] > dp[p] + 2 * g[i][i])
  67.                     dp[d] = dp[p] + 2 * g[i][i], pr[d] = {i, i};
  68.                 for (int j = 0, h = 1; j < n; j++, h *= 2) {
  69.                     if (!(d & h)) {
  70.                         if (dp[d | h] > dp[p] + g[i][j] + g[i][i] + g[j][j])
  71.                             dp[d | h] = dp[p] + g[i][j] + g[i][i] + g[j][j], pr[d | h] = {i, j};
  72.                     }
  73.                 }
  74.                 break;
  75.             }
  76.         }
  77.     }
  78.     cout << dp.back() << '\n';
  79.     int p = P - 1;
  80.     vec<int> res;
  81.     while (p) {
  82.         res.pb(0);
  83.         auto [i, j] = pr[p];
  84.         res.pb(i + 1);
  85.         if (i != j)
  86.             res.pb(j + 1);
  87.         p ^= (1 << i) | (1 << j);
  88.     }
  89.     reverse(all(res));
  90.     cout << "0 ";
  91.     for (int& i : res)
  92.         cout << i << ' ';
  93. }
  94.  
  95. signed main() {
  96.     ios::sync_with_stdio(false);
  97.     cin.tie(nullptr);
  98.  
  99.     int tt = 1;
  100.     // cin >> tt;
  101.     while (tt--)
  102.         solve();
  103.  
  104.     return 0;
  105. }
  106.  
  107. /* === динамика назад === */
  108.  
  109. // #pragma GCC optimize("Ofast")
  110. #include <bits/stdc++.h>
  111. #ifdef Local
  112. #include "debug/debug.h"
  113. #else
  114. #define debug(...)
  115. #endif
  116.  
  117. typedef long long ll;
  118. typedef long double ld;
  119.  
  120. #define int ll
  121.  
  122. #define vec vector
  123. #define str string
  124. #define all(x) (x).begin(), (x).end()
  125. #define rall(x) (x).rbegin(), (x).rend()
  126. #define sz(x) (int)(x).size()
  127. #define pb push_back
  128.  
  129. using namespace std;
  130.  
  131. struct point {
  132.     int x, y;
  133. };
  134.  
  135. int sq(int x) {
  136.     return x * x;
  137. }
  138.  
  139. int dist2(point a, point b) {
  140.     return sq(b.x - a.x) + sq(b.y - a.y);
  141. }
  142.  
  143. ld dist(point a, point b) {
  144.     return sqrt(sq(b.x - a.x) + sq(b.y - a.y));
  145. }
  146.  
  147. void solve() {
  148.     point st;
  149.     cin >> st.x >> st.y;
  150.     int n;
  151.     cin >> n;
  152.     vec<point> a(n);
  153.     vec<vec<int>> g(n, vec<int>(n));
  154.     for (point& i : a)
  155.         cin >> i.x >> i.y;
  156.     for (int i = 0; i < n; i++) {
  157.         g[i][i] = dist2(st, a[i]);
  158.         for (int j = i + 1; j < n; j++) {
  159.             g[i][j] = g[j][i] = dist2(a[i], a[j]);
  160.         }
  161.     }
  162.     const int P = 1 << n;
  163.     vec<int> dp(P, 1e10);
  164.     vec<pair<int, int>> pr(P, {-1, -1});
  165.     dp[0] = 0;
  166.     for (int p = 1; p < P; p++) {
  167.         for (int i = n - 1, k = P / 2; i >= 0; i--, k /= 2) {
  168.             if (p & k) {
  169.                 int d = p ^ k;
  170.                 dp[p] = dp[d] + g[i][i] * 2;
  171.                 pr[p] = {i, i};
  172.                 for (int j = 0, h = 1; j < n; j++, h *= 2) {
  173.                     if (d & h) {
  174.                         if (dp[p] > dp[d ^ h] + g[i][j] + g[i][i] + g[j][j])
  175.                             dp[p] = dp[d ^ h] + g[i][j] + g[i][i] + g[j][j], pr[p] = {i, j};
  176.                     }
  177.                 }
  178.                 break;
  179.             }
  180.         }
  181.     }
  182.     cout << dp.back() << '\n';
  183.     int p = P - 1;
  184.     vec<int> res;
  185.     while (p) {
  186.         res.pb(0);
  187.         auto [i, j] = pr[p];
  188.         res.pb(i + 1);
  189.         if (i != j)
  190.             res.pb(j + 1);
  191.         p ^= 1 << i | 1 << j;
  192.     }
  193.     cout << "0 ";
  194.     reverse(all(res));
  195.     for (int& i : res)
  196.         cout << i << ' ';
  197. }
  198.  
  199. signed main() {
  200.     ios::sync_with_stdio(false);
  201.     cin.tie(nullptr);
  202.  
  203.     int tt = 1;
  204.     // cin >> tt;
  205.     while (tt--)
  206.         solve();
  207.  
  208.     return 0;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement