Pagini recente » Cod sursa (job #1072531) | Cod sursa (job #1523768) | C.C. | Cod sursa (job #1010275) | Cod sursa (job #383609)
Cod sursa(job #383609)
using namespace std;
#include<fstream>
#include<vector>
#define oo LONG_MAX
#define x first
#define y second
#define mk make_pair
int cst[20][20];
int N;
int bst[(1<<17)+7][18];
vector<pair<int,int> > p;
vector<pair < pair<int, int>, int> > pre;
ifstream f("bibel.in"); ofstream g("bibel.out");
void solve()
{
int i,j,k;
N = p.size();
for(i = 0; i < N; ++i)
for(j = 0; j < N; ++j)
cst[i][j] = (p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y);
for(i = 1; i < (1<<N); ++i)
for(j = 0; j < N; ++j)
bst[i][j] = oo;
for(i = 0; i < N; ++i)
for(j = 0; j < pre.size(); ++j)
bst[1<<i][i] = min(bst[1<<i][i], pre[j].y + (pre[j].x.x - p[i].x) * (pre[j].x.x - p[i].x) + ( pre[j].x.y - p[i].y ) * ( pre[j].x.y - p[i].y ));
for( i = 1; i < (1<<N); ++i)
{
for(j = 0; j < N; ++j)
if(i & (1<<j))
for( k = 0; k < N; ++k)
{
if(!(i & (1<<k)))
if( bst[i | (1<<k)][k] > bst[i][j] + cst[j][k] )
bst[i | (1<<k)][k] = bst[i][j] + cst[j][k];
}
}
int sol = oo;
pre.clear();
for(i = 0; i < N; ++i)
{
sol = min(sol, bst[(1<<N)-1][i]);
pre.push_back(mk(p[i], bst[(1<<N)-1][i]));
}
p.clear();
g<<sol<<"\n";
}
int main()
{
int op,a,b;
pre.push_back(mk(mk(0,0),0));
for(f>>op; op!=2; f>>op)
{
if(op == 1) solve();
else { f>>a>>b; p.push_back(mk(a,b)); }
}
return 0;
}