Pagini recente » Cod sursa (job #2513801) | Cod sursa (job #2338297) | Cod sursa (job #1824521) | Cod sursa (job #2941267) | Cod sursa (job #634661)
Cod sursa(job #634661)
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define inf 0x3f3f3f3f
using namespace std;
vector< pair<int,int> > v,ww;
int din[1<<17+5][18],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 main()
{
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
int x,q,w;
while(1)
{ ++nr;
if(nr!=1)
{
ww.clear();
for(int i=0;i<N;++i)
fincost[i]=din[(1<<N)-1][i];
for(int i=0;i<N;++i)
ww.pb(v[i]);
M=N;
v.clear();
/* printf("Costuri finale:\n");
for(int i=0;i<N;++i)
printf("%d ",fincost[i]);
printf("\n");*/
}
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]=inf;
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[j][i]=inf;
if(nr==1)
{
for(int i=0;i<N;++i)
din[1<<i][i]=calc(mp(0,0),v[i]);
}
else
{
for(int i=0;i<N;++i)
{
for(int j=0;j<M;++j)
din[1<<i][i]=min(din[1<<i][i],fincost[j]+calc(v[i],ww[j]));
}
}
/* printf("Costuri initiale:\n");
for(int i=0;i<N;++i)
printf("%d ",din[i][1<<i]);
printf("\n");*/
for(int j=1;j<(1<<N);++j)
for(int i=0;i<N;++i)
{
if((j&(j-1)))
{
if((1<<i)&j)
{
for(int k=0;k<N;++k)
if((1<<k)&j)
if(k!=i)
din[j][i]=min(din[j][i],din[j^(1<<i)][k]+cost[k][i]);
}
}
}
int rez=inf;
for(int i=0;i<N;++i)
rez=min(rez,din[(1<<N)-1][i]);
printf("%d\n",rez);
}
return 0;
}