Pagini recente » Cod sursa (job #3286688) | Cod sursa (job #1897925) | Cod sursa (job #1776619) | Cod sursa (job #868477) | Cod sursa (job #430153)
Cod sursa(job #430153)
#include <algorithm>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define MAX 131075
#define sc second
#define fs first
#define DIM 20
int best[MAX][DIM],dst[DIM][DIM];
vector <pair<int,int> > v,ant;
int n,t,rez,poz=MAX-1;
vector <int> cnt;
char buff[MAX];
inline int dist (pair <int,int> a,pair <int,int> b)
{
return (a.fs-b.fs)*(a.fs-b.fs)+(a.sc-b.sc)*(a.sc-b.sc);
}
inline void cit (int &nr)
{
for ( ; !isdigit (buff[poz]); )
if (++poz==MAX)
{
fread (buff,1,MAX,stdin);
poz=0;
}
for (nr=0; isdigit (buff[poz]); )
{
nr=nr*10+buff[poz]-'0';
if (++poz==MAX)
{
fread (buff,1,MAX,stdin);
poz=0;
}
}
}
void solve ()
{
vector <pair <int,int> > :: iterator it;
int i,j,k;
n=v.size ();
for (i=0; i<n; ++i)
for (j=0; j<n; ++j)
dst[i][j]=dist(v[i],v[j]);
memset (best,INF,sizeof (best));
for (i=0; i<n; ++i)
for (j=0; j<(int)ant.size (); ++j)
best[1<<i][i]=min(best[1<<i][i],cnt[j]+dist (v[i],ant[j]));
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))
best[i][j]=min (best[i][j],best[i^(1<<j)][k]+dst[k][j]);
rez=INF;
ant.clear();
cnt.clear();
for (i=0; i<n; ++i)
{
rez=min (rez,best[(1<<n)-1][i]);
ant.push_back(v[i]);
cnt.push_back(best[(1<<n)-1][i]);
}
v.clear();
printf ("%d\n",rez);
}
int main ()
{
freopen ("bibel.in","r",stdin);
freopen ("bibel.out","w",stdout);
int tip,x,y;
ant.pb (mp (0,0));
cnt.pb (0);
for (cit (tip); tip!=2; cit (tip))
{
if (tip==1)
solve ();
else
{
cit (x); cit (y);
v.pb (mp (x,y));
}
}
return 0;
}