Pagini recente » Cod sursa (job #1439996) | Cod sursa (job #1604642) | Cod sursa (job #3187973) | Cod sursa (job #195116) | Cod sursa (job #2498671)
#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;
char s[55];
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] = (A[i].x - A[j].x) * (A[i].x - A[j].x) + (A[i].y - A[j].y) * (A[i].y - A[j].y);
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, nr, ok , aux , m;
na = 0;
nb = 2;
while(gets(s))
{
if(s[0] == '2')
break;
if(s[0] == '0')
{
++ na;
m = strlen(s);
nr = ok = 0;
for(i = 1 ; i < m ; ++ i)
{
if(s[i] != ' ')
nr = nr * 10 + s[i] - '0';
if((i > 1 && s[i] == ' ' && s[i - 1] != ' ') || (i == m - 1 && s[i] != ' '))
{
if(ok == 0)
A[na].x = nr;
else
A[na].y = nr;
ok = 1;
nr = 0;
}
}
continue;
}
if(s[0] == '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] + (A[i].x - B[j].x) * (A[i].x - B[j].x) + (A[i].y - B[j].y) * (A[i].y - B[j].y);
cost[i][0] = min(cost[i][0] , aux);
cost[0][i] = min(cost[0][i] , aux);
}
dinamica(na);
nb = na;
na = 0;
}
}
return 0;
}