Pagini recente » Cod sursa (job #2584829) | Cod sursa (job #643084) | Cod sursa (job #1839644) | Cod sursa (job #2083690) | Cod sursa (job #634632)
Cod sursa(job #634632)
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
using namespace std;
vector< pair<int,int> > v,ww;
int din[18][1<<17+5],fincost[20];
int cost[25][25],N,M;
int nr=0;
inline int calc(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);
};
int nrbit(int bits)
{int num=0;
while(bits)
{
if(bits%2==1)
++num;
bits=bits/2;
}
return num;
};
int main()
{
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
int x,q,w;
while(1)
{ ++nr;
if(nr!=1)
{
for(int i=0;i<N;++i)
fincost[i]=din[i][(1<<N)-1];
for(int i=0;i<N;++i)
ww.pb(v[i]);
M=N;
v.clear();
}
do
{
scanf("%d",&x);
if(x==2)
return 0;
if(x==0)
{
scanf("%d%d",&q,&w);
v.push_back( mp(q,w) );
}
}
while(x==0);
if(x==2)
return 0;
N=v.size();
for(int i=0;i<N;++i)
for(int j=0;j<N;++j)
{
if(i==j)
cost[i][j]=12345678;
cost[i][j]=calc(v[i],v[j]);
}
if(nr==1)
{
for(int i=0;i<N;++i)
for(int j=0;j<(1<<N);++j)
din[i][j]=12345678;
for(int i=0;i<N;++i)
din[i][1<<i]=calc(mp(0,0),v[i]);
}
else
{
for(int i=0;i<N;++i)
{
din[i][1<<i]=12345678;
for(int j=0;j<M;++j)
din[i][1<<i]=min(din[i][1<<i],fincost[j]+calc(v[i],ww[j]));
}
}
if(nr!=1)
for(int i=0;i<N;++i)
for(int j=0;j<(1<<N);++j)
if(nrbit(j)!=1)
din[i][j]=12345689;
// for(int i=0;i<N;++i)
// printf("%d! ",din[i][1<<i]);
for(int j=1;j<(1<<N);++j)
for(int i=0;i<N;++i)
{
if(nrbit(j)!=1)
{
if((1<<i)&j)
{
for(int k=0;k<N;++k)
din[i][j]=min(din[i][j],din[k][j^(1<<i)]+cost[i][k]);
}
}
}
int rez=12345678;
for(int i=0;i<N;++i)
rez=min(rez,din[i][(1<<N)-1]);
printf("%d\n",rez);
}
return 0;
}