Pagini recente » Cod sursa (job #983726) | Cod sursa (job #1496012) | Cod sursa (job #2769919) | Cod sursa (job #203222) | Cod sursa (job #3001033)
#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;
}