Pagini recente » Cod sursa (job #2563987) | Cod sursa (job #596481) | Cod sursa (job #840732) | Cod sursa (job #663046) | Cod sursa (job #356667)
Cod sursa(job #356667)
#include <cstdio>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define FIN "bibel.in"
#define FOUT "bibel.out"
#define N 18
#define MAXST 131072
#define oo 1000000000
#define minim(a,b) ((a) > (b)) ? (b) : (a)
int d1[N], d2[MAXST][N], P[N], d[N][N];
pair <short int, short int> v1[N], v2[N];
inline int dist(pair <short int, short int> a, pair <short int, short int> b)
{
return ((b.first - a.first) * (b.first - a.first) + (b.second - a.second) * (b.second - a.second));
}
void solve()
{
int i, st, k;
for (i = 0; i <= 17; ++ i)
d1[i] = d2[P[v1[0].first] - 1][i];
//memcpy(d1[i], d2[i], sizeof(d2[i]));
for (k = 0; k < P[17]; ++ k)
for (i = 0; i <= 17; ++ i)
d2[k][i] = oo;
for (i = 1; i <= v2[0].first; ++ i)
for (k = 1; k <= v2[0].first; ++ k)
d[i][k] = dist(v2[i], v2[k]);
for (i = 0; i < v2[0].first; ++ i)
for (k = 0; k < v1[0].first; ++ k)
d2[P[i]][i] = minim(d2[P[i]][i], d1[k] + dist(v1[k + 1], v2[i + 1]));
for (st = 0; st < P[v2[0].first]; ++ st)
for (i = 0; i < v2[0].first; ++ i)
if (st & P[i])
for (k = 0; k < v2[0].first; ++ k)
if (st & P[k])
d2[st][i] = minim(d2[st][i], d2[st - P[i]][k] + d[k + 1][i + 1]);
}
int main()
{
int i, t = 0, r;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
v1[1] = make_pair(0, 0);
v1[0].first = 1;
for (i = 0; i < 18; ++ i)
P[i] = 1 << i;
while (t != 2)
{
scanf("%u", &t);
if (!t) {
++ v2[0].first;
scanf("%u%u", &v2[v2[0].first].first, &v2[v2[0].first].second);
}
if (t == 1)
{
solve();
for (i = 0, r = oo; i < v2[0].first; ++ i)
r = minim(r, d2[P[v2[0].first] - 1][i]);
printf("%u\n", r);
memcpy(v1, v2, sizeof(v2));
v2[0].first = 0;
}
}
}