Pagini recente » Cod sursa (job #2203267) | Cod sursa (job #2595534) | Cod sursa (job #1092922) | Cod sursa (job #3253710) | Cod sursa (job #139162)
Cod sursa(job #139162)
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
#define nm 17
#define INF 0x3f3f3f3f
#define pb push_back
struct point
{
int x;
int y;
};
vector <point> v, w;
vector <int> vd, wd;
int k, x, y;
int A[1 << nm][nm], D[nm][nm];
int solve();
void read()
{
w.pb((point) { 0, 0});
wd.pb(0);
while (!feof(stdin))
{
scanf("%d ", &k);
switch (k)
{
case 0:
{
scanf("%d %d ", &x, &y);
v.pb((point) {x, y} );
break;
}
case 1:
{
printf("%d\n", solve());
v.swap(w);
v.clear();
vd.swap(wd);
vd.clear();
break;
}
case 2:
{
}
}
}
}
int dist(const point a, const point b)
{
return ((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}
inline int MN(int a, int b) { return (a < b ? a : b); }
int solve()
{
int i, j, cfg;
for (i=0; i<(1 << v.size()); ++i)
{
for (j=0; j<v.size(); ++j)
{
A[i][j] = INF;
}
}
for (i=0; i<v.size(); ++i)
{
for (j=0; j<v.size(); ++j)
{
D[i][j] = dist(v[i], v[j]);
}
}
for (i=0; i<v.size(); ++i)
{
for (j=0; j<w.size(); ++j)
{
A[1 << i][i] = MN(A[1 << i][i], dist(v[i], w[j]) + wd[j]);
}
}
for (cfg=0; cfg < (1 << v.size()); ++cfg)
{
vector <int> poz;
for (i=0; i<v.size(); ++i)
{
if (cfg & ( 1 << i))
poz.pb(i);
}
if (poz.size() > 1)
for (i=0; i<v.size(); ++i)
{
if (cfg & (1 << i))
{
int cfg2 = cfg ^ (1 << i);
for (j=0; j<poz.size(); ++j)
{
if (poz[j] != i)
{
A[cfg][i] = MN(A[cfg][i], A[cfg2][poz[j]] + D[poz[j]][i] );
}
}
// cfg2 = cfg ^ (1 << i);
}
}
}
for (i=0; i<v.size(); ++i)
{
vd.pb(A[(1 << v.size()) -1][i]);
}
return *min_element(vd.begin(), vd.end());
}
int main()
{
freopen("bibel.in", "r", stdin);
freopen("bibel.out","w",stdout);
read();
return 0;
}