Pagini recente » Cod sursa (job #1673633) | Cod sursa (job #2658272) | Cod sursa (job #2358582) | Cod sursa (job #504957) | Cod sursa (job #648555)
Cod sursa(job #648555)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[(1 << 17) + 5][17], sol, ttt, P = 1, Q, NV;
struct punct {int x, y;} v[20][2], ZERO;
inline int dist(punct a, punct b)
{
int var = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
return var;
}
int main()
{
ifstream f("bibel.in");
ofstream g("bibel.out");
for (; ; ++ttt)
{
int x = 0, N = 0;
for (; ; )
{
f >> x;
if (x == 0)
{
f >> v[N][P].x >> v[N][P].y;
++N;
}
else break ;
}
if (x == 2) break ;
// Q e anteriorul
if (ttt)
{
for (int i = 0; i < N; ++i) a[1 << i][i] = 2100000000;
for (int j = 0; j < NV; ++j)
for (int i = 0; i < N; ++i) a[1 << i][i] = min(a[1 << i][i], a[(1 << NV) - 1][j] + dist(v[j][Q], v[i][P]));
for (int i = 1; i < (1 << N); ++i)
for (int j = 0; j < N; ++j)
if (i & (i - 1))
a[i][j] = 2100000000;
}
else
{
for (int i = 1; i < (1 << N); ++i)
for (int j = 0; j < N; ++j)
a[i][j] = 2100000000;
for (int i = 0; i < N; ++i) a[1 << i][i] = dist(ZERO, v[i][P]);
}
for (int i = 0; i < (1 << N); ++i)
for (int j = 0; j < N; ++j) // extinzi pe a[i][j]
if (i & (1 << j))
for (int k = 0; k < N; ++k) // cu ultimul in k
if (!(i & (1 << k)))
a[i | (1 << k)][k] = min(a[i | (1 << k)][k], a[i][j] + dist(v[j][P], v[k][P]));
/*for (int i = 0; i < (1 << N); ++i, cout << '\n')
for (int j = 0; j < N; ++j)
cout << a[i][j] << ' ';*/
sol = 2000000000;
for (int i = 0; i < N; ++i)
if (sol > a[(1 << N) - 1][i] && a[(1 << N) - 1][i])
sol = a[(1 << N) - 1][i];
g << sol << '\n';
NV = N;
P ^= Q ^= P ^= Q;
}
g.close();
return 0;
}