Pagini recente » Cod sursa (job #1385834) | Cod sursa (job #1887508) | Cod sursa (job #2237587) | Cod sursa (job #9216) | Cod sursa (job #389792)
Cod sursa(job #389792)
#include <fstream>
#include <vector>
using namespace std;
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
#define a first
#define b second
const int MAX_N = 20;
const int MAX_L = (1 << 17);
const int INF = 0x3f3f3f3f;
ifstream fin ("bibel.in");
ofstream fout ("bibel.out");
struct ant
{
int x, y, c;
};
int N, M, C[MAX_L][MAX_N], D[MAX_N][MAX_N];
vector <pair<int, int> > V;
vector <ant> Ant;
void solve()
{
N = V.size();
M = (1 << N);
for(int i = 0; i < N; ++i)
for(int j = 0; j < N; ++j)
D[i][j] = (V[i].a - V[j].a)*(V[i].a - V[j].a) + (V[i].b - V[j].b)*(V[i].b - V[j].b);
memset(C, INF, sizeof C);
for(int i = 0; i < N; ++i)
foreach(Ant)
{
int x = it -> x;
int y = it -> y;
int c = it -> c;
C[(1 << i)][i] = min(C[(1 << i)][i], c + (V[i].a - x)*(V[i].a - x) + (V[i].b - y)*(V[i].b - y));
}
for(int i = 1; i < M; ++i)
for(int j = 0; j < N; ++j)
if(i & (1 << j))
for(int k = 0; k < N; ++k)
if(!(i & (1 << k)))
C[i | (1 << k)][k] = min(C[i | (1 << k)][k], C[i][j] + D[j][k]);
int Sol = INF;
ant t;
Ant.clear();
for(int i = 0; i < N; ++i)
{
Sol = min(Sol, C[M-1][i]);
t.x = V[i].a, t.y = V[i].b, t.c = C[M-1][i];
Ant.push_back(t);
}
V.clear();
fout << Sol << "\n";
}
int main()
{
ant t;
t.x = t.y = t.c = 0;
Ant.push_back(t);
int p;
for(fin >> p; p != 2; fin >> p)
{
if(p == 1) solve();
else
{
int a, b;
fin >> a >> b;
V.push_back(make_pair(a, b));
}
}
}