Pagini recente » Cod sursa (job #1013055) | Cod sursa (job #3250176) | Cod sursa (job #2504010) | Cod sursa (job #1014294) | Cod sursa (job #117939)
Cod sursa(job #117939)
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX_LEV 205
#define MAX_P 17
#define FIN "bibel.in"
#define FOUT "bibel.out"
#define mp make_pair
#define pb push_back
#define x first
#define y second
#define sqr(x) ((x)*(x))
#define dist(a, b) sqr(a.x-b.x)+sqr(a.y-b.y)
#define INF 0x3f3f3f3f
typedef pair<int, int> point;
int D[MAX_P][MAX_P], A[MAX_P][1<<MAX_P], bst[MAX_LEV][MAX_P], Res;
vector<point> P[MAX_LEV];
int main(void)
{
int op, x, y, i, j, k, p, n, lv = 0;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
P[0].pb(mp(0, 0));
for (lv = 1; scanf("%d %d %d", &op, &x, &y) == 3; ++lv)
{
P[lv].pb(mp(x, y));
while (scanf("%d", &op) == 1 && !op)
{
scanf("%d %d", &x, &y);
P[lv].pb(mp(x, y));
}
n = P[lv].size();
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
D[i][j] = dist(P[lv][i], P[lv][j]);
memset(bst[lv], 0x3f, sizeof(bst[0]));
for (i = 0; i < n; ++i)
{
for (j = 1; j < (1<<n); ++j)
for (k = 0; k < n; ++k) A[j][k] = INF;
A[1<<i][i] = 0;
for (j = 1; j < (1<<n); ++j)
for (k = 0; k < n; ++k)
{
if (A[j][k] == INF) continue;
for (p = 0; p < n; ++p)
{
if (j&(1<<p)) continue;
A[j|(1<<p)][p] = min(A[j|(1<<p)][p], A[j][k]+D[k][p]);
}
}
for (j = 0; j < n; ++j)
for (k = 0; k < P[lv-1].size(); ++k)
bst[lv][j] = min(bst[lv][j], bst[lv-1][k]+dist(P[lv-1][k], P[lv][i])+A[(1<<n)-1][j]);
}
Res = INF;
for (i = 0; i < n; ++i)
Res = min(Res, bst[lv][i]);
printf("%d\n", Res);
}
return 0;
}