Pagini recente » Cod sursa (job #1633302) | Cod sursa (job #2911566) | Cod sursa (job #1934049) | Cod sursa (job #61744) | Cod sursa (job #2498090)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = (1 << 30);
struct POINT
{
int x, y;
};
POINT A[18], B[18];
int d[(1 << 18) + 5][18], cost[18][18], ca[18], cb[18] , cmin;
inline int dist(POINT P1, POINT P2)
{
return (P1.x - P2.x) * (P1.x - P2.x) + (P1.y - P2.y) * (P1.y - P2.y);
}
inline void dinamica(int n)
{
int i, j, k, bitmask, new_bitmask, lim, cmin;
for(i = 1 ; i < n ; ++ i)
for(j = 1 ; 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] = 0;
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]);
}
cmin = INF;
for(i = 1 ; i < n ; ++ i)
{
cb[i] = d[lim][i];
cmin = min(cmin , cb[i]);
B[i] = A[i];
}
printf("%d\n" , cmin);
}
int main()
{
freopen("bibel.in", "r", stdin);
freopen("bibel.out", "w", stdout);
int na, nb, i, j , p, tx, ty , aux;
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)
cost[i][0] = cost[0][i] = INF;
for(i = 1 ; i < na ; ++ i)
for(j = 1 ; j < nb ; ++ j)
{
aux = cb[j] + dist(A[i] , B[j]);
cost[i][0] = min(cost[i][0] , aux);
cost[0][i] = min(cost[0][i] , aux);
}
dinamica(na);
nb = na;
na = 0;
}
else
break;
}
return 0;
}