Pagini recente » Cod sursa (job #619492) | Cod sursa (job #1437716) | Cod sursa (job #1311615) | Cod sursa (job #96373) | Cod sursa (job #634666)
Cod sursa(job #634666)
#include<fstream>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
vector< pair<int,int> > v,ww;
int din[(1<<17)+5][17],fincost[20];
int cost[25][25],N,M;
int rez;
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()
{
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
{
fin>>x;
if(x==2)
return 0;
if(x==0)
{
fin>>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]);
}
}
}
rez=inf;
for(int i=0;i<N;++i)
rez=min(rez,din[(1<<N)-1][i]);
fout<<rez<<"\n";
}
return 0;
}