Pagini recente » Cod sursa (job #1522158) | Cod sursa (job #1615168) | Cod sursa (job #1104417) | Cod sursa (job #106586) | Cod sursa (job #1723666)
#include <fstream>
using namespace std;
ifstream f("bibel.in");
ofstream g("bibel.out");
const int f_mare = 2000000000;
int xx, x[25], y[25], n, np;
int xp[25], yp[25], lvl;
int mat[180000][25];
inline int dist(int x1, int y1,
int x2, int y2){
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
inline int rezolva(){
int i, j, k;
if (lvl == 1)
np = n;
for (i = 1; i < (1 << n); i++)
for (j = 0; j < n; j++)
mat[i][j] = f_mare;
for (j = 0; j < np; j++)
for (i = 0; i < n; i++)
mat[(1 << i)][i] = min(mat[(1<<i)][i], mat[0][j]+dist(x[i], y[i], xp[j], yp[j]));
for (i = 1; i < (1 << n); i++)
for (j = 0; j < n; j++)
if (i & (1 << j))
for (k = 0; k < n; k++)
if (i & (1 << k) && k != j)
mat[i][j] = min(mat[i][j], mat[i^(1<<j)][k] + dist(x[k], y[k], x[j], y[j]));
int minim = f_mare;
for (i = 0; i < n; i++){
minim = min(minim, mat[(1 << n)-1][i]);
xp[i] = x[i];
yp[i] = y[i];
mat[0][i] = mat[(1<<n)-1][i];
}
np = n;
return minim;
}
int main(){
lvl = 1;
while (1){
f >> xx;
if (xx == 0){
f >> x[n] >> y[n];
n++;
}
else if (xx == 1){
g << rezolva() << '\n';
lvl++;
n = 0;
}
else if (xx == 2)
break;
}
return 0;
}