Pagini recente » Cod sursa (job #889324) | Cod sursa (job #1237623) | Cod sursa (job #2329724) | Cod sursa (job #1102115) | Cod sursa (job #430222)
Cod sursa(job #430222)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("bibel.in");
ofstream fout ("bibel.out");
#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define MAX 131075
#define sc second
#define fs first
#define DIM 20
vector <pair <pair <int,int>,int> > ant;
int best[MAX][DIM],dst[DIM][DIM];
vector <pair <int,int> > v;
int n,rez;
inline void solve ()
{
int i,j,k;
n=v.size ();
for (i=0; i<n; ++i)
for (j=0; j<n; ++j)
dst[i][j]=(v[i].fs-v[j].fs)*(v[i].fs-v[j].fs)+(v[i].sc-v[j].sc)*(v[i].sc-v[j].sc);
for (i=0; i<(1<<n); ++i)
for (j=0; j<n; ++j)
best[i][j]=INF;
for (i=0; i<n; ++i)
for (j=0; j<ant.size (); ++j)
best[1<<i][i]=min (best[1<<i][i],ant[j].sc+(v[i].fs-ant[j].fs.fs)*(v[i].fs-ant[j].fs.fs)+(v[i].sc-ant[j].fs.sc)*(v[i].sc-ant[j].fs.sc));
for (i=0; 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(best[i|(1<<k)][k]>best[i][j]+dst[j][k])
best[i|(1<<k)][k]=best[i][j]+dst[j][k];
rez=INF;
ant.clear ();
for (i=0; i<n; ++i)
{
rez=min (rez,best[(1<<n)-1][i]);
ant.pb (mp (v[i],best[(1<<n)-1][i]));
}
v.clear ();
fout<<rez<<"\n";
}
int main ()
{
int tip,x,y;
ant.pb (mp (mp (0,0),0));
for (fin>>tip; tip!=2; fin>>tip)
{
if (tip==1)
solve ();
else
{
fin>>x>>y;
v.pb (mp (x,y));
}
}
return 0;
}