Cod sursa(job #1749099)

Utilizator akaprosAna Kapros akapros Data 27 august 2016 21:06:19
Problema Bibel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
#define maxN 17
#define maxP (1 << 17) + 2
#define mp make_pair
#define pii pair < int, int >
#define f first
#define s second
#define inf 2000000000
using namespace std;
int t, n, m, all, ans, s, dp[maxN][maxP], a[maxN][maxN];
struct coord
{
    int x, y;
} v[maxN], w[maxN];
void solve();
void write();
void read()
{
    int x = 0;
    n = 0;
    while (1)
    {
        scanf("%d", &x);
        if (x == 2)
            exit(0);
        if (x == 1)
        {
            ++ t;
            break;
        }
        scanf("%d %d", &v[n].x, &v[n].y);
        ++ n;
    }
    if (t == 1)
        ++ n;
    solve();
    write();
    read();
}

void init()
{
    int i, j;
    all = (1 << n) - 1;
    ans = inf;

    for (i = 0; i < n; ++ i)
        for (j = 1; j <= all; ++ j)
            dp[i][j] = inf;
    for (i = 0; i < n - 1; ++ i)
        for (j = i + 1; j < n; ++ j)
            a[i][j] = a[j][i] = (v[i].x - v[j].x) * (v[i].x - v[j].x) + (v[i].y - v[j].y) * (v[i].y - v[j].y);
}
int dist(coord a, coord b)
{
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
int get_dp()
{
    int i, j, x;
    for (i = 0; i < m; ++ i)
        for (j = 0; j < n; ++ j)
            dp[j][1 << j] = min(dp[j][1 << j], dp[i][0] + dist(w[i], v[j]));

    for (i = 1; i < (1 << n) - 1; ++ i)
        for (x = 0; x < n; ++ x)
            if (i & (1 << x))
                for (j = 0; j < n; ++ j)
                    if (x != j)
                        if (!(i & (1 << j)))
                            dp[j][i ^ (1 << j)] = min(dp[x][i] + a[x][j], dp[j][i ^ (1 << j)]);

    m = n;
    for (i = 0; i < n; ++ i)
    {
        if (dp[i][all] < ans)
            ans = dp[i][all];
        dp[i][0] = dp[i][all];
        w[i] = v[i];
    }
}

void solve()
{
    int i, j, p, val = 0;
    init();
    get_dp();
    m = n;
    for (i = 1; i <= m; ++ i)
        w[i] = v[i];
}
void write()
{
    printf("%d\n", ans);
}
int main()
{
    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);
    ++ m;
    read();
    return 0;
}