Pagini recente » Cod sursa (job #546307) | Cod sursa (job #692888) | Cod sursa (job #1351901) | Cod sursa (job #590201) | Cod sursa (job #2497110)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 2.e9;
struct POINT
{
int x, y;
};
POINT A[19], B[19];
int d[(1 << 17) + 5][19], cost[19][19], ca[19], cb[19];
int dist(POINT P1, POINT P2)
{
return (P1.x - P2.x) * (P1.x - P2.x) + (P1.y - P2.y) * (P1.y - P2.y);
}
void dinamica(int n, int cstart)
{
int i, j, k, bitmask, new_bitmask, lim, cmin;
for(i = 0 ; i < n ; i ++)
for(j = 0 ; j < n ; j ++)
cost[i][j] = dist(A[i], A[j]);
lim = (1 << n) - 1;
for(i = 0 ; i <= lim ; i ++)
for(j = 0 ; j < n ; j ++)
d[i][j] = INF;
d[1][0] = cstart;
for(bitmask = 0 ; bitmask <= lim ; bitmask ++)
for(i = 0 ; i < n ; i ++)
if(bitmask & (1 << i))
for(j = 0 ; j < n ; j ++)
if(!(bitmask & (1 << j)))
{
new_bitmask = (bitmask | (1 << j));
d[new_bitmask][j] = min(d[new_bitmask][j], d[bitmask][i] + cost[i][j]);
}
for(i = 1 ; i < n ; i ++)
ca[i] = min(ca[i], d[lim][i]);
}
int main()
{
freopen("bibel.in", "r", stdin);
freopen("bibel.out", "w", stdout);
int na, nb, i, p, tx, ty, cmin;
na = 0;
nb = 2;
while(scanf("%d", &p) != EOF)
{
if(p == 0)
{
scanf("%d%d", &tx, &ty);
na ++;
A[na].x = tx;
A[na].y = ty;
}
else if(p == 1)
{
na ++;
for(i = 1 ; i < na ; i ++)
ca[i] = INF;
for(i = 1 ; i < nb ; i ++)
{
A[0] = B[i];
dinamica(na, cb[i]);
}
memcpy(cb, ca, sizeof(ca));
cmin = INF;
for(i = 1 ; i < na ; i ++)
{
B[i] = A[i];
cmin = min(cmin, ca[i]);
}
nb = na;
printf("%d\n", cmin);
na = 0;
}
else
break;
}
return 0;
}