Cod sursa(job #3001033)

Utilizator mateitudordmDumitru Matei mateitudordm Data 13 martie 2023 10:22:52
Problema Bibel Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>
#define int long long

using namespace std;

ifstream cin ("bibel.in");
ofstream cout ("bibel.out");

const int nmax = 18, inf = 1e17;

int x[nmax + 1], y[nmax + 1], lx[nmax + 1], ly[nmax + 1];
int dp[18][150000];

int cost (int i, int j)
{
    return (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
}
int cost2 (int i, int j)
{
    return (x[i] - lx[j]) * (x[i] - lx[j]) + (y[i] - ly[j]) * (y[i] - ly[j]);
}

signed main()
{
    int c, n = 0, i, j, p = 0, ln, bit;

    while (cin >> c)
    {
        if (c == 0)
        {
            n++;
            cin >> x[n] >> y[n];
        }
        else if (c == 1)
        {
            p++;
            if (p != 1)
            {
                for (i = 1; i <= n; i++)
                    dp[i][ (1 << (i - 1))] = inf;
                for (i = 1; i <= n; i++)
                {
                    for (j = 1; j <= ln; j++)
                    {
                        dp[i][ (1 << (i - 1))] = min (dp[i][ (1 << (i - 1))],
                                                      dp[j][ (1 << ln) - 1] + cost2 (i, j));
                        //cout << j << " " << i << " " << dp[i][ (1 << (i - 1))] << '\n';
                    }
                }
                for (i = 1; i <= ((1 << n) - 1); i++)
                    for (j = 1; j <= n; j++)
                        if (i != (1 << (j - 1)))
                            dp[j][i] = inf;
            }
            else
            {
                for (i = 1; i <= ((1 << n) - 1); i++)
                    for (j = 1; j <= n; j++)
                        dp[j][i] = inf;
                for (i = 1; i <= n; i++)
                    dp[i][ (1 << (i - 1))] = cost (0, i);
            }

            for (i = 1; i <= ((1 << n) - 1); i++)
            {
                for (j = 1; j <= n; j++)
                {
                    if ((i & (1 << (j - 1))) != 0)
                    {
                        for (bit = 1; bit <= n; bit++)
                        {
                            if ((i & (1 << (bit - 1))) == 0)
                            {
                                dp[bit][ (i | (1 << (bit - 1)))] =
                                    dp[j][i] + cost (j, bit);
                                //cout << bit << " " << (i | (1 << (bit - 1)))
                                     //<< " " << j << " " << i << " " << dp[bit][ (i | (1 << (bit - 1)))] << " " << dp[j][i] << " " << '\n';
                            }
                        }
                    }
                }
            }

            int best = inf;
            for (i = 1; i <= n; i++)
                best = min (best, dp[i][ (1 << n) - 1]);

            cout << best << '\n';

            ln = n;
            for (i = 1; i <= ln; i++)
                lx[i] = x[i], ly[i] = y[i];
            n = 0;
        }
    }
    return 0;
}