Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* === динамика вперед === */
- // #pragma GCC optimize("Ofast")
- #include <bits/stdc++.h>
- #ifdef Local
- #include "debug/debug.h"
- #else
- #define debug(...)
- #endif
- typedef long long ll;
- typedef long double ld;
- #define int ll
- #define vec vector
- #define str string
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define sz(x) (int)(x).size()
- #define pb push_back
- using namespace std;
- struct point {
- int x, y;
- };
- int sq(int x) {
- return x * x;
- }
- int dist2(point a, point b) {
- return sq(b.x - a.x) + sq(b.y - a.y);
- }
- ld dist(point a, point b) {
- return sqrt(sq(b.x - a.x) + sq(b.y - a.y));
- }
- void solve() {
- point st;
- cin >> st.x >> st.y;
- int n;
- cin >> n;
- vec<point> a(n);
- vec<vec<int>> g(n, vec<int>(n));
- for (point& i : a)
- cin >> i.x >> i.y;
- int ans = 0;
- for (int i = 0; i < n; i++) {
- g[i][i] = dist2(st, a[i]);
- ans += g[i][i];
- for (int j = i + 1; j < n; j++) {
- g[i][j] = g[j][i] = dist2(a[i], a[j]);
- }
- }
- const int P = 1 << n;
- vec<int> dp(P, 1e10);
- vec<pair<int, int>> pr(P, {-1, -1});
- dp[0] = 0;
- for (int p = 0; p < P; p++) {
- for (int i = 0, k = 1; i < n; i++, k *= 2) {
- if (!(p & k)) {
- int d = p | k;
- if (dp[d] > dp[p] + 2 * g[i][i])
- dp[d] = dp[p] + 2 * g[i][i], pr[d] = {i, i};
- for (int j = 0, h = 1; j < n; j++, h *= 2) {
- if (!(d & h)) {
- if (dp[d | h] > dp[p] + g[i][j] + g[i][i] + g[j][j])
- dp[d | h] = dp[p] + g[i][j] + g[i][i] + g[j][j], pr[d | h] = {i, j};
- }
- }
- break;
- }
- }
- }
- cout << dp.back() << '\n';
- int p = P - 1;
- vec<int> res;
- while (p) {
- res.pb(0);
- auto [i, j] = pr[p];
- res.pb(i + 1);
- if (i != j)
- res.pb(j + 1);
- p ^= (1 << i) | (1 << j);
- }
- reverse(all(res));
- cout << "0 ";
- for (int& i : res)
- cout << i << ' ';
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int tt = 1;
- // cin >> tt;
- while (tt--)
- solve();
- return 0;
- }
- /* === динамика назад === */
- // #pragma GCC optimize("Ofast")
- #include <bits/stdc++.h>
- #ifdef Local
- #include "debug/debug.h"
- #else
- #define debug(...)
- #endif
- typedef long long ll;
- typedef long double ld;
- #define int ll
- #define vec vector
- #define str string
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define sz(x) (int)(x).size()
- #define pb push_back
- using namespace std;
- struct point {
- int x, y;
- };
- int sq(int x) {
- return x * x;
- }
- int dist2(point a, point b) {
- return sq(b.x - a.x) + sq(b.y - a.y);
- }
- ld dist(point a, point b) {
- return sqrt(sq(b.x - a.x) + sq(b.y - a.y));
- }
- void solve() {
- point st;
- cin >> st.x >> st.y;
- int n;
- cin >> n;
- vec<point> a(n);
- vec<vec<int>> g(n, vec<int>(n));
- for (point& i : a)
- cin >> i.x >> i.y;
- for (int i = 0; i < n; i++) {
- g[i][i] = dist2(st, a[i]);
- for (int j = i + 1; j < n; j++) {
- g[i][j] = g[j][i] = dist2(a[i], a[j]);
- }
- }
- const int P = 1 << n;
- vec<int> dp(P, 1e10);
- vec<pair<int, int>> pr(P, {-1, -1});
- dp[0] = 0;
- for (int p = 1; p < P; p++) {
- for (int i = n - 1, k = P / 2; i >= 0; i--, k /= 2) {
- if (p & k) {
- int d = p ^ k;
- dp[p] = dp[d] + g[i][i] * 2;
- pr[p] = {i, i};
- for (int j = 0, h = 1; j < n; j++, h *= 2) {
- if (d & h) {
- if (dp[p] > dp[d ^ h] + g[i][j] + g[i][i] + g[j][j])
- dp[p] = dp[d ^ h] + g[i][j] + g[i][i] + g[j][j], pr[p] = {i, j};
- }
- }
- break;
- }
- }
- }
- cout << dp.back() << '\n';
- int p = P - 1;
- vec<int> res;
- while (p) {
- res.pb(0);
- auto [i, j] = pr[p];
- res.pb(i + 1);
- if (i != j)
- res.pb(j + 1);
- p ^= 1 << i | 1 << j;
- }
- cout << "0 ";
- reverse(all(res));
- for (int& i : res)
- cout << i << ' ';
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int tt = 1;
- // cin >> tt;
- while (tt--)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement